我期待以下代码段:
var = "Not Empty" unless defined? var
var # => nil
返回"Not Empty"
,但我得到nil
。对此为何发生的任何见解?
答案 0 :(得分:10)
这是Ruby中我称之为实际WTF的唯一时刻之一。
你必须使用
unless defined? var
var = :value
end
使用postfix语法,解释器将在内部nil
- ify值,以便它可以推断变量,从而在检查完成之前定义它:
# 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)
答案 1 :(得分:2)
在解析它们时定义局部变量(如nil
)。 var2
的定义先于条件。即使未执行赋值,也会定义var2
。然后,条件评估定义var2
,保留nil
的值var2
。