破壊的なのが苦手

なんか、Rubyで書いている時、破壊的メソッドつかうのに抵抗がある。必要であれば、使うんだけどさ。なんとか使わない方法を考えてしまう。

今日、ある文字列を置換して出力するスクリプト書いていた。それsedで(ryとかいっちゃいけない。
置換しなきゃいけない文字列がいくつかあるから、置換前と置換後の文字列をハッシュに保存して、置換をするというようにしてみた。

で、以下の2通りのどっちにするかまよってしまった。

str = " .. ." # 置換対象の文字列
hash = { .. } # 置換前の文字列と置換後の文字列をキーと値として保持したハッシュ
puts(eval hash.inject("str"){ |s,h| s << ".gsub(/#{h[0]}/,\"#{h[1]}\")" })

str = " .. ." # 置換対象の文字列
hash = { .. } # 置換前の文字列と置換後の文字列をキーと値として保持したハッシュ
hash.each_pair{|k,v| str.gsub!(/k/,v) }
puts str

頭では、後者のほうが自然かなぁとは思うんだけど、なんか破壊的とか副作用って言葉に過剰に反応してしまい、前者のほうで書いてしまった。evalはいくないというから抵抗あったんだけど。

しかし、今更ながら、Hashのeachやinjectでわたってくる要素が配列だということに気づいた。俺、実はHashってあんまり使いたがらないんだ。Hashのeachやinjectでわたってくる要素は、Hashであって欲しいとおもうんだけど、普通は配列のほうが自然なのかしら。