原です。

> まつもと ゆきひろです

> まず,第一にsub/sub!の動作はこれで正常です.またそれらに対す
> る理解も正しいと思います.で,問題は「sub!で予想外の文字列が
> 変更されるのがいや」という点ですね.特に,subが置換が発生し
> なかった場合にもとの文字列を返す点が気になっていると理解しま
> した.

私の理解ではもとさんがいやがっておられるのは sub! で予想外の
文字列が変更される事というより、sub での返り値になるオブジェ
クトがランタイムに決まる事なんではないでしょうか?

私も bar = foo.dup; bar.sub!(/X/, "Y") と bar = foo.sub(/X/, "Y") 
は同値になると思い込んでいたので意外でした。