それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rubyのString#insert は破壊的メソッドだった。

びっくりマークがついてないので、非破壊的メソッドだと思ってコード書いてたら、どうもオカシイのでよく調べてみたら破壊的メソッドだった。ハマった

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 のこの動きは周知の事実なのか。うーん。