为什么这两个陈述不等同?
defined? foo ? foo << "bar" : foo = ["bar"]
if (defined? foo) then foo << "bar" else foo = ["bar"] end
第一句话:
irb(main):001:0> defined? foo ? foo << "bar" : foo = ["bar"]
=> nil
irb(main):002:0> foo
=> nil
irb(main):003:0> defined? foo ? foo << "bar" : foo = ["bar"]
=> "expression"
irb(main):004:0> foo
=> ["bar"]
第二声明:
irb(main):001:0> if (defined? foo) then foo << "bar" else foo = ["bar"] end
=> ["bar"]
irb(main):002:0> foo
=> ["bar"]
irb(main):003:0> if (defined? foo) then foo << "bar" else foo = ["bar"] end
=> ["bar", "bar"]
irb(main):004:0> foo
=> ["bar", "bar"]
这些会话使用JRuby 1.5.0(应该等同于原生Ruby 1.8.7)。我看到使用原生ruby 1.9.1略有不同的行为:声明#1从未定义foo
,即使在运行它两次时也是如此。
答案 0 :(得分:5)
因为第一个评估为:
defined?(foo ? foo << "bar" : foo = ["bar"])
为什么返回nil,我不知道......
修复只是这样做:
(defined? foo) ? foo << "bar" : foo = ["bar"]
答案 1 :(得分:1)
- 定义? foo? foo&lt;&lt; “bar”:foo = [“bar”]
- if(定义?foo)然后foo&lt;&lt; “bar”else foo = [“bar”] end
醇>
在任何一种情况下,您的代码都可能会被简化。基于上面的两个样本,它看起来像是某种封闭的循环。而不是尝试在其中创建foo
并初始化为第一个['bar']
,我会做类似的事情:
foo = []
... start some loop ...
foo << bar
... end some loop ...
或者,如果您不喜欢从附加到数组的位置分解初始化程序:
(foo ||= []) << "bar"
第二种方式有点“Perlish”,但它从Ruby-way到目前为止还没有解读。