From: Koji Arai Date: 2002-09-01T02:26:18+09:00 Subject: [ruby-dev:18119] Re: Object#become 新井です。 In message "[ruby-dev:18118] Re: Object#become" on 01 Sep 2002 01:37:22 +0900, matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > まつもと ゆきひろです > > In message "[ruby-dev:18114] Object#become" > on 02/08/31, Koji Arai writes: > > |become は、Object のインスタンスの場合だけ、インスタンス変数 > |を引き継ぐようですが、これはオブジェクトの特性がインスタンス > |変数の違いでしかあらわれないからといったところでしょうか? > > いいえ、T_OBJECTでない場合はCLONESETUPの中でコピーされていま > す。T_CLASSとT_MODULEの場合にはrb_mod_clone()の中で明示的に > コピーされています。 > > |一般に特異メソッドやインスタンス変数などは引き継がないと考え > |た方がよいですよね? > > cloneでは特異メソッドも含めて引き継ぎます。cloneでもdupでも > インスタンス変数は引き継ぎます。 これは、clone の話ですかね? become に関して言えば、 class Foo @v = 1 end klass = Class.new.become(Foo) p klass klass.instance_eval { p @v } => ruby 1.7.3 (2002-08-30) [i586-linux] # -:7: warning: instance variable @v not initialized nil のように引き継がないようですが、まだ 2002-08-30 では実装が不 完全ってところでしょうか。 ちなみに、以下のようにすると SEGV するのですが、きっとまつも とさんの手元では直ってるかな?、 class Foo end p obj = Foo.new obj.instance_eval { @v = 1 } p obj.become(Foo.new) obj.instance_eval { p @v } => ruby 1.7.3 (2002-08-30) [i586-linux] # -:6: [BUG] Segmentation fault ruby 1.7.3 (2002-08-30) [i586-linux] > |String#replace は、String#become ですが、Array#replace や > |Hash#replace は違うようです。これは何か理由がありますか? > |become とreplace を使い分ける上での指針のようなもの。 > > いまんところ違いはないです。たまたま実装が違うだけ(そのうち > マージします)。それから先については悩んでいるんです。 > > (1) 全部replaceにする > (2) 今までreplaceがあったものはbecomeの別名にする > (3) becomeをメソッドとしてみせる必要はない > > まだ決定ではありません。 > 了解です。 -- 新井康司 (Koji Arai)