Mapa de uma matriz modificando apenas elementos que correspondem a uma determinada condição

No Ruby, qual é a maneira mais expressiva de mapear uma matriz de maneira que certos elementos sejam modificados e os outros deixaram intocados?

Esta é uma maneira direta de fazer isso:

old_a = ["a", "b", "c"]                         # ["a", "b", "c"]
new_a = old_a.map { |x| (x=="b" ? x+"!" : x) }  # ["a", "b!", "c"]

Omitir o caso "deixar sozinho", é claro, se não for suficiente:

new_a = old_a.map { |x| x+"!" if x=="b" }       # [nil, "b!", nil]

O que eu gostaria é algo assim:

new_a = old_a.map_modifying_only_elements_where (Proc.new {|x| x == "b"}) 
        do |y|
          y + "!"
        end
# ["a", "b!", "c"]

Existe alguma maneira legal de fazer isso no Ruby (ou talvez o Rails tenha algum tipo de método de conveniência que eu ainda não encontrei

Obrigado a todos por responderem. Enquanto você me convenceu coletivamente de que é melhor usarmap com o operador ternário, alguns de vocês postaram respostas muito interessante

questionAnswers(8)

yourAnswerToTheQuestion