В Ruby наиболее выразительный способ сопоставить массив таким образом, чтобы некоторые элементы были изменены, а остальные остались нетронутыми?
Это прямой способ сделать это:
old_a = ["a", "b", "c"] # ["a", "b", "c"]
new_a = old_a.map { |x| (x=="b" ? x+"!" : x) } # ["a", "b!", "c"]
Опуская "автономный" случай, конечно, если этого недостаточно:
new_a = old_a.map { |x| x+"!" if x=="b" } # [nil, "b!", nil]
Что бы я хотел, это примерно так:
new_a = old_a.map_modifying_only_elements_where (Proc.new {|x| x == "b"})
do |y|
y + "!"
end
# ["a", "b!", "c"]
Есть ли какой-нибудь хороший способ сделать это в Ruby (или, может быть, у Rails есть какой-то метод удобства, который я еще не нашел)?
Спасибо всем за ответ. В то время как вы коллективно убедили меня, что лучше всего использовать map
с тройным оператором, некоторые из вас отправили очень интересные ответы!