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

时间:2010-09-23 04:10:30

标签: ruby

当它实际上没有定义时,它只是因为它被“触摸”而得到值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 ...没有。

3 个答案:

答案 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,然后运行为其赋值的表达式。