`定义?`和`除非’没有按预期工作
我期待以下片段:
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
。