From: matz@... (Yukihiro Matsumoto) Date: 1997-11-13T18:03:38+09:00 Subject: [ruby-list:5285] Re: sub まつもと ゆきひろです In message "[ruby-list:5284] sub" on 97/11/13, "Motoyuki S." writes: |もと@大計といいます. |で,今日は sub & sub! について質問(というか,確認かな)に来ました. まず,第一にsub/sub!の動作はこれで正常です.またそれらに対す る理解も正しいと思います.で,問題は「sub!で予想外の文字列が 変更されるのがいや」という点ですね.特に,subが置換が発生し なかった場合にもとの文字列を返す点が気になっていると理解しま した. 結論から言うと「この仕様を変更する予定はありません」. subの仕様は「置換が行われた文字列を返す」というものです.置 換がまったく起きなかった場合に元の文字列を返すのは効率のため です.問題はsub!が共有されている可能性のある文字列を問答無用 で書き換えてしまうことにあります.よりややこしい例をあげましょ う. foo = "foo" print foo.sub!("f", "b"), foo, "\n" => booboo # boofooではない このような問題があるのでsub!のような「破壊的な」メソッドには! のついた普通でない名前がついているわけです.迷うようならsub を使いましょう. |sub でパターンにマッチしないと,ポインタ(っていうのかな.C でいうポインタ) |が戻り値になるためだと思うのですが,こういうものなのでしょうか. こういうものです. |感覚的には,パターンにマッチしなかった場合も b = a.dup のようになって |欲しいのです. |#あらかじめ b = a.dup しておくのが正しい書き方なのかもしれませんが. sub!を使わないのが正しい書き方だと思います. |世間のスクリプト言語がどのようになっているかわからないのですが,「こういう |仕様のほうが僕の場合は感覚的に合うなぁ」というお話でした. Perlとかでは代入によって文字列のコピーが発生するのでこのよう な問題は起きませんし,Pythonでは文字列はimmutable(書き換えが 起きない)なので文字列に関してはこのような問題が起きません. が,配列やオブジェクトについては類似の問題が発生します. まつもと ゆきひろ /:|)