dby*_*rne 0 ruby jruby ternary-operator
为什么这两个陈述不相同?
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"]
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即使在运行它两次.
因为第一个评估为:
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)