`定义?`和`除非’没有按预期工作

我期待以下片段:

var = "Not Empty" unless defined? var var # => nil 

返回"Not Empty" ,但我nil 。 任何洞察为什么会发生这种情况?

这是Ruby中我称之为实际WTF的唯一时刻之一。

你必须使用

 unless defined? var var = :value end 

使用postfix语法,解释器将在内部对值进行nil化,以便它可以推断变量,从而在检查完成之前定义它:

 # Doesn't print anything unless defined?(foo) and (p(foo) or true) foo = :value end # Prints nil bar = :value unless defined?(bar) and (p(bar) or true) 

局部变量在解析它们时定义(为nil )。 var2定义在条件之前。 即使未执行赋值,也会定义var2 。 然后,条件评估定义了var2 ,它保留了var2的值nil