Ruby三元运算符

dby*_*rne 0 ruby jruby ternary-operator

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

  1. defined? foo ? foo << "bar" : foo = ["bar"]
  2. 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"]
Run Code Online (Sandbox Code Playgroud)

第二个声明:

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"]
Run Code Online (Sandbox Code Playgroud)

这些会话使用JRuby 1.5.0(应该等同于本机Ruby 1.8.7).我看到与原生ruby 1.9.1略有不同的行为:声明#1从未定义,foo即使在运行它两次.

Dar*_*ust 5

因为第一个评估为:

defined?(foo ? foo << "bar" : foo = ["bar"])
Run Code Online (Sandbox Code Playgroud)

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

修复只是做:

(defined? foo) ? foo << "bar" : foo = ["bar"]
Run Code Online (Sandbox Code Playgroud)

  • @Mörre这取决于你使用的ruby版本.你可能正在使用ruby 1.9. (2认同)