びっくりマークがついてないので、非破壊的メソッドだと思ってコード書いてたら、どうもオカシイのでよく調べてみたら破壊的メソッドだった。ハマった
name = "takuya" #=> "takuya" name.insert(1,"#") #=> "t#akuya" puts name #=> "t#akuya" ←これは。。。
対策。cloneするべ
name = "takuya" name.clone.insert(1,"#") #=> "t#akuya" puts name #=> "takuya"
対策:モンキーパッチだろここは
class String alias_method :insert!, :insert def insert(a,b) self.clone.insert!(a,b) end end
これで期待通りになった。
?> name = "takuya" => "takuya" >> name.insert(1, "##") => "t##akuya" >> name => "takuya" >> name.insert!(1, "##") => "t##akuya" >> name => "t##akuya" >>
ruby1.8.7 でも確認した。同様の挙動だった。
相当前からこういう仕様らしい。ってことはinsert のこの動きは周知の事実なのか。うーん。