Ruby for C++ User / gsub!中にパターンマッチした文字が上手く置換されない

Powered by dKingyo Java | C言語 | C++ | C言語 | 逆引きハンドブック

今日のRubyで嵌った事。
Rubyの String#gsub! はsに行った処理によってオブジェクト内の文字列の置換してくれるのだと思っていた。
だが、違っていたのだ。

str = "abc def"
i = 0
str.gsub!("abc"){|s|
 s = %Q(Ruby[#{i}])
 p s
 i = i+1 
}

処理結果


"Ruby[0]"
"1 def"
sに処理結果を入れたので"1 def" ではなくて"Ruby[0] def"になってほしいのだ。


この原因は ...

str = "abc def"
i = 0
str.gsub!("abc"){|s|
 s =%Q(Ruby[#{i}])
 p s
 i = i+1 # ここにある。
}

最後に処理した結果がsに反映されてしまうのだ。
おそらくRubyの関数の仕様と同じ働きなのだろう・・・。
よって・・・

str = "abc def"
i = 0
str.gsub!("abc"){|s|
 ts = %Q(Ruby[#{i}])
 p ts
 i = i+1 
 ts
}
p str

にて期待する処理結果が返ってくる。


"Ruby[0]"
"Ruby[0] def"
嗚呼、これに気付けず無駄な時間を過ごす・・・。
この問題に3時間も費やしてしまった。