From: Tomoyuki Kosimizu Date: 2000-03-11T04:36:23+09:00 Subject: [ruby-list:21306] Re: 引数コピーとオブジェクト指向 越水です。 あのコード、例としてはマズかったですね。ああしたコードでは、文字列を受 け取ったらdupするのがフツーです。数値(Fixnumなど)が自動的にコピーされ るのと同じです。 懲りずに同じコードをあげますが: class Perosn def initialize(name) @name = name end end name = 'John' john = Person.new (name) このコードでPerson.newを呼び出したとすると、窓を持っているのはmain(と いうか何か)とPersonオブジェクトです。前にも書いたとおり、『窓を持つ』 あるいは『窓を作る』という行為には、ある種の権限が必要です。上のコード でいえば、Person#initializeがpublicですから、どこでも誰でもその権限を 得ることができます。しかし、権限が与えられた以上、それなりの責任も負わ なければなりません。ですから、mainは、name.sub!のような『引っかき回す』 ことに慎重でなければなりません。 また、窓はいつまでも開いているわけではありません。オブジェクトはGCにか けられるまで存在していますが、窓はスコープとともに消えます。スコープを 小さくすれば、誤って引っかき回してしまう可能性も小さくなります。 引っかき回してもいいかどうかは、Personが決めています。引っかき回される のがイヤならば: class Person def initialize(name) @name = name.dup end end とし、同じクラスのオブジェクトくらいだったら引っかき回してもいいよ、と 決めたなら: class Person def initialize(name) @name = name.dup end protected def name=(name) @name = name end end などとします。他のオブジェクトからはいじられたくない、と決めたら privateを使うというわけです。 越水 greentea@fa2.so-net.ne.jp