渡谷です。すばやい回答ありがとうございます。 >> "GOTO" == GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp> writes: 渡谷> Rubyで、あるクラスのインスタンスを複数の方法で生成したい 渡谷> のですが、 渡谷> 渡谷> class A def initialize(a,b) ... end 渡谷> 渡谷> def initialize(c,d,e) ... end end 渡谷> 渡谷> のように書くと見事にinitializeが再定義されてしまいます。 GOTO> initialize は A.new から呼ばれるものです。 それはわかってた(つもりだった)んですけど、上記のように書いて A.new(a,b) A.new(c,d,e) とかできたらいいな、って安直に考えてしまったわけです。 #で、引数の数が違うと怒られてしまったと。 GOTO> それが一つの方法ですね。別解としては下のようなのがあり GOTO> ます。 GOTO> class A class << self alias __new__ new end GOTO> def A.new(*arg) GOTO> __new__(*arg).instance_eval{init1(*arg); self} end (以下略) newを再定義してしまうわけですか。確かにこれならできますね。 ありがとうございます。 #そうか、Rubyではnewもメソッドなんだな、うんうん。 #やっぱりわかった"つもり"はよくない。 ところで、やっぱり私があげた方法(*つきの仮引数を使って initialize内部で条件分岐する)にしてもGOTOさんの方法にしても ちょっと複雑になるというか可読性が落ちるというか、ムツカシク なりますよね? 皆様どうしているのでしょうか? #もしかしてそんな程度でムツカシイなんていってちゃいけない? #それとも正しくRuby的なプログラミングをすればそもそも #initializerが複数欲しいなんて要求自体出てこない? では。 東京大学医学部5年 渡谷 岳行(わただに たけゆき) watadani / tubulin.cb.m.u-tokyo.ac.jp