当它实际上没有定义时,它只是因为它被“触摸”而得到值nil
:
$ irb
ruby-1.9.2-p0 > foo = true if !defined? foo
=> nil
ruby-1.9.2-p0 > foo
=> nil
ruby-1.9.2-p0 > if !defined? bar
ruby-1.9.2-p0 ?> bar = true
ruby-1.9.2-p0 ?> end
=> true
ruby-1.9.2-p0 > bar
=> true
所以if
... end
按预期工作,但foo = true if ...
没有。
答案 0 :(得分:3)
Ruby在执行包含赋值的行之前定义了一个局部变量,因此{one}的defined?(foo)
始终为true
。
另一个示例显示在执行该行的任何部分之前定义了局部变量:
defined? foo # => false
foo = foo # => foo is now nil
答案 1 :(得分:1)
听起来确实合理 [声明]如果[表达]
只是由编译器重新排列为
如果[表达]那么 [声明] 端
但看起来它是以一种破坏定义的方式专门处理的?实际上,定义看起来像一个特殊的构造(即不是正常的函数)
看起来如果你在同一行分配它,你应该检查.nil?代替:
foo = foo.nil? ? true:foo
(如果已经设置为false,这也有效)
答案 2 :(得分:1)
考虑这个问题的方法是:
foo = (true if !defined? foo)
因此,首先定义foo,然后运行为其赋值的表达式。