三元运算符

时间:2011-07-01 12:36:58

标签: ruby conditional-operator

我有一个数组d = ['foo', 'bar', 'baz'],并希望将其元素放在最后一个元素的, and 分隔的字符串中,以便它将成为foo, bar and baz

这是我正在尝试做的事情:

s = ''
d.each_with_index { |x,i|
  s << x
  s << i < d.length - 1? i == d.length - 2 ? ' and ' : ', ' : ''
}

但解释器出错:

`<': comparison of String with 2 failed (ArgumentError)

但是,它适用于+=而不是<<,但Ruby Cookbook说:

  

如果效率对您很重要,请在可以将项目附加到现有字符串时不要构建新字符串。 [等等] ...改为使用 str << var1 << ' ' << var2

在这种情况下是否可以不使用+=

此外,必须有比上面的代码更优雅的方式。

3 个答案:

答案 0 :(得分:5)

你只是缺少一些括号:

    d = ['foo', 'bar', 'baz']
    s = ''
    d.each_with_index { |x,i|
      s << x
      s << (i < d.length - 1? (i == d.length - 2 ? ' and ' : ', ') : '')
    }

答案 1 :(得分:4)

我找到了

s << i < d.length - 1? i == d.length - 2 ? ' and ' : ', ' : ''

难以阅读或维护。

我可能会将其改为

join = case
when i < d.length - 2 then ", "
when i == d.length - 2 then " and "
when i == d.length then ""
end
s << join

或者可能

earlier_elements = d[0..-2].join(", ")
s = [earlier_elements, d[-1..-1]].join(" and ")

或者

joins = [", "] * (d.length - 2) + [" and "]
s = d.zip(joins).map(&:join).join

答案 2 :(得分:1)

这样简单得多:

"#{d[0...-1].join(", ")} and #{d.last}"