ごとけんです

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