もと@大計といいます.
皆様はじめまして.

今までオブジェクト指向言語はおろか,perl とかも全くさわったことはなかった
のですが,今さら perl を覚えるのがしゃくだったので(^_^;),ruby の勉強を
始めました.

で,今日は sub & sub! について質問(というか,確認かな)に来ました.


現在,ruby - version 1.0-971021 on FreeBSD2.2.5R という環境にあります.
で,以下のスクリプトを走らせると,

---------------------------------------------------------------------------
#!/usr/local/bin/ruby

a = "abcdefghij"

b = a.sub("bcd","!!!")
print "a:#{a} b:#{b}\n"

b.sub!("ghi","$$$")
print "a:#{a} b:#{b}\n"
---------------------------------------------------------------------------

a:abcdefghij b:a!!!efghij
a:abcdefghij b:a!!!ef$$$j

と,意図したような結果が帰ってくるのですが,

---------------------------------------------------------------------------
#!/usr/local/bin/ruby

a = "abcdefghij"

b = a.sub("zzz","!!!")  # ここで,マッチしないようにする.
print "a:#{a} b:#{b}\n"

b.sub!("ghi","$$$") 
print "a:#{a} b:#{b}\n"
---------------------------------------------------------------------------

とすると,

a:abcdefghij b:abcdefghij
a:abcdef$$$j b:abcdef$$$j

と,b.sub! で a のほうも変更されてしまいます.

sub でパターンにマッチしないと,ポインタ(っていうのかな.C でいうポインタ)
が戻り値になるためだと思うのですが,こういうものなのでしょうか.

感覚的には,パターンにマッチしなかった場合も b = a.dup のようになって
欲しいのです.
#あらかじめ b = a.dup しておくのが正しい書き方なのかもしれませんが.


世間のスクリプト言語がどのようになっているかわからないのですが,「こういう
仕様のほうが僕の場合は感覚的に合うなぁ」というお話でした.

それでは,失礼します.


---
moto