为什么这个Ruby'if'表现不如预期?

时间:2010-04-01 09:50:57

标签: ruby

我确定我在这里遗漏了一些东西,但也是如此。

foo['bar'] = nil

if(foo['bar'] == nil)
   puts "foo bar is nil :("

但是,没有任何反应?有什么想法吗?

3 个答案:

答案 0 :(得分:10)

您需要end声明来关闭if,即

if(foo['bar'] == nil)
   puts "foo bar is nil :("
end

请注意,有一个nil?方法可以检查某些内容是否为nil,并且您的条件周围的括号不是必需的,因此可以写出更惯用的Ruby:

if foo['bar'].nil?
  puts "foo bar is nil :("
end

Arkku所述,单行if可以简洁地写成:

puts "foo bar is nil :(" if foo['bar'].nil?

哪个更好取决于上下文(例如,您是想强调条件还是强调条件为真时会发生什么)以及一定程度的个人偏好。但作为一个例子,你可以在一个方法的开头加上一个保护条件,例如

raise "bar needed" if foo['bar'].nil?

答案 1 :(得分:2)

nil在某种情况下将其视为完全错误。因此,如果您的变量确实为零,则不需要测试。

foo = {}
foo['bar'] = nil
puts "foo bar is nil :(" unless foo['bar']
puts "foo bar is nil :(" if !foo['bar']

在ruby中只是nil而false在条件声明中返回false。

答案 2 :(得分:1)

irb(main):002:0> foo = {}
=> {}
irb(main):003:0> foo['bar'] = nil
=> nil
irb(main):004:0> foo['bar']
=> nil
irb(main):005:0> if foo['bar'] == nil
irb(main):006:1> puts "foo bar nil"
irb(main):007:1> end
foo bar nil
=> nil