From: matz@... (Yukihiro Matsumoto) Date: 1997-09-09T12:38:28+09:00 Subject: [ruby-list:4228] Re: Mini ML Program まつもと ゆきひろです In message "[ruby-list:4227] Re: Mini ML Program" on 97/09/09, Kikutani Makoto writes: |なるほど。この場合のsuperが、自分のinitializeというのが |ちょっとわかりずらいのです。スーパークラスが自分のクラス? どこがわかりずらいのかが,よくわからなかったのですが,rubyに おける一般的なオブジェクトの生成と初期化は以下のようなステッ プで行われます. Cmail.new でクラスCmailのメソッドnewが呼ばれる. super でクラスCmailから見て上位のクラス(あるいはincludeされている モジュール)で定義されている同名のメソッドが呼ばれる(この場合 はnew). クラスClassにはメソッドnewが定義されているので,Class#newが 呼ばれる. Class#newは新しくオブジェクトを生成し,そのオブジェクトの initializeメソッドを呼ぶ(引数はnewに渡されたものと一緒). ユーザが定義したinitializeの中で必要な初期化が行われる.デフォ ルトのinitialize(Object#initialize)はなにもしない.ユーザ定 義initializeの中でスーパークラスの初期化ルーチンを起動したい 時にはsuperを使ってスーパークラスのinitializeを呼び出す. となっています. |あと、rubyではコンストラクタの引数の数によって挙動を |変えるというのはできますか? rubyにはC++の引数による多重定義(overloading)のようなことはで きませんが,オプショナル引数や引数をまとめて配列としてうける ことができますので,引数の数や型によってメソッドの中で分岐す ることが出来ます. オブジェクトの初期化を変えるだけでしたら,initializeの中で分 岐すれば良いでしょうし,生成方法そのものを変えようと思えば, newを再定義する必要があるかも知れません. うぅ,良い実例が思いつかなかった まつもと ゆきひろ /:|)