Ruby三元运算符

时间:2011-03-09 15:44:38

标签: ruby jruby ternary-operator

为什么这两个陈述不等同?

  1. defined? foo ? foo << "bar" : foo = ["bar"]
  2. if (defined? foo) then foo << "bar" else foo = ["bar"] end
  3. 第一句话:

    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,即使在运行它两次时也是如此。

2 个答案:

答案 0 :(得分:5)

因为第一个评估为:

defined?(foo ? foo << "bar" : foo = ["bar"])

为什么返回nil,我不知道......

修复只是这样做:

(defined? foo) ? foo << "bar" : foo = ["bar"]

答案 1 :(得分:1)

  
      
  1. 定义? foo? foo&lt;&lt; “bar”:foo = [“bar”]
  2.   
  3. if(定义?foo)然后foo&lt;&lt; “bar”else foo = [“bar”] end
  4.   

在任何一种情况下,您的代码都可能会被简化。基于上面的两个样本,它看起来像是某种封闭的循环。而不是尝试在其中创建foo并初始化为第一个['bar'],我会做类似的事情:

foo = []
... start some loop ...
  foo << bar
... end some loop ...

或者,如果您不喜欢从附加到数组的位置分解初始化程序:

(foo ||= []) << "bar"

第二种方式有点“Perlish”,但它从Ruby-way到目前为止还没有解读。

相关问题