ごとけんです
In message "[ruby-list:14417] はじめまして"
on 99/05/21, Kenji Horikoshi <k-horix / s.email.ne.jp> writes:
>today = "1999/05/21"
>date1 = today
>today.sub!(/^/, "'")
>today.sub!(/$/, "'")
>
>上記の処理では,todayのみを処理したつもりでもdate1も同様に
>処理されてしまいます.こういう場合はsubをつかうべきでしょうか.
えっと、これは sub と sub! の違いというよりも、変数とオブジェ
クトの関係を理解されると納得できると思います。
一言で言ってしまえば Ruby では変数とはオブジェクトにつける名
前のことで、代入(左辺 = 右辺)は常に名前をつける操作に相当し
ます。右辺に現れた変数はその変数が指すオブジェクトとみなされ
ます。そのため、
today = "1999/05/21"
date1 = today
の結果は
today ---> "1999/05/21" <--- date1
のように、today と date1 は同じオブジェクトを指しています。
一方、
today = "1999/05/21"
date1 = "1999/05/21"
とすると、
today ---> "1999/05/21"
date1 ---> "1999/05/21"
のように表示は同じ "1999/05/21" ですが別々のオブジェクトを指
すことになります。んで、解決方法ですが、次のようなやり方があ
ります。
1. sub を使う。
today = "1999/05/21"
date1 = today
today = today.sub(/^/, "'")
today = today.sub(/$/, "'")
このように、str.sub!(...) と str = str.sub(...) は意味が異
なります。sub は新しく作られたオブジェクトを結果として返し
ます。
2. dup 複製を作るメソッド dup を使う。
today = "1999/05/21"
date1 = today.dup
today.sub!(/^/, "'")
today.sub!(/$/, "'")
dup は新たに作ったオブジェクトの複製を返します。
…てな感じですが疑問は解消されましたか??
-- gotoken