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
所以if
… end
按预期工作,但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,然后运行为其赋值的表达式。