我有一个数组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
。
在这种情况下是否可以不使用+=
?
此外,必须有比上面的代码更优雅的方式。
答案 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}"