From: gotoken@... (GOTO Kentaro) Date: 1999-05-21T20:43:31+09:00 Subject: [ruby-list:14418] substitution, variable (Re: はじめまして) ごとけんです In message "[ruby-list:14417] はじめまして" on 99/05/21, Kenji Horikoshi 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