Ruby的新手,如果else语句不起作用

时间:2017-10-20 04:07:44

标签: ruby if-statement

输入数字时,它不会打印出给定值的任何字符串。如果我输入100,不应该打印“去服务器机房”?

stress = gets.chomp!
def stress
  if stress === 100
    p "Go to server room"
  elsif stress > 50
    puts "Take a break"
  else
    p "Continue working"
  end
end

p stress

4 个答案:

答案 0 :(得分:2)

  

如果我输入100,不应该打印"去服务器房间"?

我假设您希望程序读取用户输入,然后根据输入打印不同的消息。

  

[我是#Ruby]的新手

好的,首先,Ruby不会像JavaScript或PHP那样进行隐式类型转换。或者不是相同的程度。它允许您比较浮点数和整数:

1.0 == 1 #=> true

但是比较字符串和整数并不是那样的:

'1' == 1 #=> false

你必须自己转换它:

'1'.to_i == 1 #=> true

由于您的输入应该是一个整数,我们可以立即转换它:

stress = gets.to_i

输入 1 0 0 输入时,gets将返回"100\n"并且to_i会将其解释为整数,返回100to_i会忽略尾随换行符,因此我们不需要chomp)。

stress现在是一个整数,因此您可以将其与其他整数进行比较:

if stress == 100
  puts "Go to server room"
elsif stress > 50
  puts "Take a break"
else
  puts "Continue working"
end

我已将===更改为==。对于比较,你几乎总是想要后者。 ===在Ruby中具有特殊含义。现在就避开它。

上面的代码已经可以使用了,但你想要一个方法。您可以调用您的方法stress,即为变量和方法使用相同的名称。但它使你的代码很多更难理解。因此,让我们选择不同的方法名称,例如message。虽然我们正在使用它,但我们也会删除重复的puts次调用,因此只返回消息而不打印它:

def message(stress)
  if stress == 100
    "Go to server room"
  elsif stress > 50
    "Take a break"
  else
    "Continue working"
  end
end

您可以通过以下方式调用上述方法:

input = gets.to_i
puts message(input) # <- 'puts' is now here

我故意为输入选择了一个不同的变量名,以区别于方法参数。

答案 1 :(得分:0)

您的变量和方法定义具有相同的名称。尝试更改:

stress = gets.chomp!

var = gets.chomp!

然后设置您的方法以接受变量:

def stress(s)
  if s.to_i == 100
    p "Go to server room"
  elsif s.to_i > 50
    puts "Take a break"
  else
    p "Continue working"
  end
end

p stress(var)

你也可以接近你正在做的事情,只使用你方法名称以外的变量:

var = gets.chomp!
def stress
  if self.to_i == 100
    p "Go to server room"
  elsif self.to_i > 50
    puts "Take a break"
  else
    p "Continue working"
  end
end

p var.stress

答案 2 :(得分:0)

这里有一些问题。首先,正如已经提到的那样,你没有向你的方法传递参数。另一方面,gets方法返回一个String,而不是一个整数,因此如果传递结果,则将String与整数进行比较。

像这样重写你的方法:

def stress(level_string)
  level = level_string.to_i
  if level == 100
    "Go to server room"
  elsif stress > 50
    "Take a break"
  else
    "Continue working"
  end
end

现在你可以尝试:

>> level_string = gets.chomp!
>> 100
#> "100"
>> stress(level_string)
#> "Go to server room"

答案 3 :(得分:0)

在你的陈述中

p stress

输出名为stress的变量的值,而不是方法压力返回的值。

您可以拥有一个同名的方法和变量,但是您必须使用括号调用该方法:

p stress()

在您的特定情况下,您会遇到下一个问题:在方法 stress内,您处于嵌套范围内,这意味着外部的变量 stress不可见。因此,在声明中

if stress === 100

你指的是方法压力,即你有一个递归。

有几种可能的解决方案:

  • 通过参数
  • 传递变量
  • 更改变量名称
  • 更改方法的名称

根据经验,我建议

  • 永远不会给变量和方法赋予相同的名称,
  • 不要从方法
  • 中的外部范围访问变量

除非你有充分的理由不这样做。