【问题标题】:Beginner Ruby if else初学者 Ruby if else
【发布时间】:2011-11-18 18:38:54
【问题描述】:

我检查了程序是否正在接收号码和姓名,并且确实如此。我想知道为什么当输入数字为 1 时它不打印“fred”?

number = ARGF.read.chomp
names = %w{fred betty barney}
if number == 1
  puts names[0]
elsif number == 2
  puts names[1]
elsif number == 3
  puts name[2]
end

【问题讨论】:

  • 看起来数字是一个字符串,比较不应该像“1”、“2”和“3”吗?

标签: ruby if-statement


【解决方案1】:

number 在这里可能是一个字符串,但您将它与一个整数进行比较。

1 == '1' # false

试试

number = ARGF.read.chomp.to_i # note the to_i here
names = %w{fred betty barney}
if number == 1
  puts names[0]
elsif number == 2
  puts names[1]
elsif number == 3
  puts names[2]
end

此外,当您想要基于单个变量的多个值采用不同的路径时,您可以使用case/when 语句。这通常是处理此类流量的更简洁的方式。

number = ARGF.read.chomp.to_i
names = %w{fred betty barney}

case number
when 1
  puts names[0]
when 2
  puts names[1]
when 3
  puts names[2]
end

或者在这种情况下,更简单:

number = ARGF.read.chomp.to_i
names = %w{fred betty barney}
puts names[number-1]

应该可以。

【讨论】:

  • 使用case 语句更好,原因有很多:执行速度明显更快,更易于阅读,尤其是在将多个值映射到单个操作时,因为不需要or,并且不可能无意中与= 分配而不是与== 进行比较。令人担忧的是,您也是唯一认识到这是数组索引问题并且根本不需要那种逻辑的答案。
  • “执行速度明显更快” ... [需要引用]
  • 不是引用,但至少相关:stackoverflow.com/questions/4178240/…
【解决方案2】:

我知道您正在学习 if...else,但请记住,您也可以这样做:

number = ARGF.read.chomp.to_i - 1
names = %w{fred betty barney}

puts names[number]

【讨论】:

    【解决方案3】:

    number 是一个字符串,而不是一个整数。您可以转换为整数:

    number = ARGF.read.chomp.to_i
    

    或者您可以改为针对字符串进行测试:

    if number == "1"
      ...
      ...
      ...
    

    【讨论】:

    • 天哪,这几乎让我在我编写的每个程序中都感到沮丧...转换为字符串和整数。无论如何,非常感谢您的回复,非常感谢。
    【解决方案4】:

    number 是一个字符串。你可以通过像这样打印它的类来检查它:

    p number.class
    

    您需要将number 转换为这样的整数:

    number = ARGF.read.chomp.to_i
    

    请记住,尽管to_i 会为无效字符串返回0。仅当您确定传入数据时才执行此操作。

    在Codepad 上试试这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2016-07-04
      相关资源
      最近更新 更多