【问题标题】:Ruby ternary operatorRuby 三元运算符
【发布时间】:2011-07-12 00:26:11
【问题描述】:

为什么这两个语句不等价?

  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"]

第二句话:

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

【问题讨论】:

    标签: ruby jruby ternary-operator


    【解决方案1】:

    因为第一个计算结果为:

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

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

    解决方法很简单:

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

    【讨论】:

    • 谢谢,我早该想到的!
    • “为什么返回 nil,我不知道..”:当我输入问题的第一行“定义?foo?foo
    • @Mörre 这取决于您使用的 ruby​​ 版本。您可能正在使用 ruby​​ 1.9。
    • 确实如此。我无法想象有人还会自愿使用 1.8,这太“昨天”了 :)
    • @Mörre:当然,我确实在 IRB 中摆弄过我的答案是正确的;-P 我也得到了nil,拥有 Mac OS X 附带的 Ruby 1.8.7雪豹……
    【解决方案2】:
    1. 已定义?富? foo
    2. if (defined?foo) then foo

    在任何一种情况下,您的代码都可能会被简化。根据上面的两个示例,看起来会有某种封闭循环。与其尝试在其中创建foo 并初始化为第一个['bar'],不如执行以下操作:

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

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

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

    第二种方式有点“Perlish”,但它与 Ruby 方式相差不远,无法破译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2013-02-06
      • 2013-04-29
      • 2015-01-15
      • 2017-07-10
      • 1970-01-01
      • 2018-09-10
      相关资源
      最近更新 更多