Ruby的“foo = true if if!defined? foo“将无法按预期工作

当它实际上没有定义时,它的值为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 

所以ifend按预期工作,但foo = true if ...没有。

Ruby在执行包含赋值的行之前定义了一个局部变量,因此defined?(foo)对于一行来说总是true

另一个示例显示在执行该行的任何部分之前定义局部变量:

 defined? foo # => false foo = foo # => foo is now nil 

如果[表达],[声明]确实合理

只是由编译器重新排列

if [表达]然后[声明]结束

但看起来它是以一种破坏定义的方式专门处理的? 实际上,定义看起来像一个特殊的构造(即不是正常的函数)

看起来如果你在同一行分配它,你应该检查.nil? 代替:

foo = foo.nil? ? 是的:foo

(如果已经设置为false,这也有效)

思考这个问题的方法是:

 foo = (true if !defined? foo) 

因此,首先定义foo,然后运行为其赋值的表达式。