一部のコードを他の言語からRubyに移植しています。クラスでは、これら4つのコンストラクターとの互換性を維持する必要があります。
def initialize(b)
def initialize(a, b)
def initialize(b, c)
def initialize(a, b, c)
私はこの方法を試していましたが、機能しません:
def initialize(a="", b, c="")
スマートな解決策はありますか?ハッシュは使えません。
一部のコードを他の言語からRubyに移植しています。クラスでは、これら4つのコンストラクターとの互換性を維持する必要があります。
def initialize(b)
def initialize(a, b)
def initialize(b, c)
def initialize(a, b, c)
私はこの方法を試していましたが、機能しません:
def initialize(a="", b, c="")
スマートな解決策はありますか?ハッシュは使えません。
ハッシュを使用できず(なぜですか?)、それらがメソッドでなければならない場合は、運が悪い可能性があります。initialize
入力や位置情報がなければ、たとえば配列を分解して、どの引数がどれであるかを判断する方法はありません。
IMOが最もクリーンなのは、構築を行い、コンストラクター(この場合はファクトリ)に固有の引数を受け入れるクラスメソッドを提供することです。
引数のタイプが異なる場合は、その情報を使用して、渡される値を判別できますが、IMOはかなり醜くなります。
が完全に異なるタイプであり、常にそうなる場合a,b,c
は、おそらく次のようになります。
def initialize(*args)
args.each do |arg|
do_a if arg.is_a?(first_type)
do_b if arg.is_a?(second_type)
do_c if arg.is_a?(third_type)
end
end
認めます、それはきれいではありませんが、うまくいくはずです。3つのパラメータのみが必要な場合は、each
を実行するように制限します3.times
。
これは解決策かもしれませんが、まあそれは醜いです!
def initialize(*args)
case (args.length)
when 1
super(XXX)
@y = args[0]
when 2
if args[0].kind_of?(A) then
super(args[0])
@x = args[0]
@y = args[1]
elsif args[0].kind_of?(B) then
super(XXX)
@y = args[0]
@z = args[1]
end
when 3
super(args[0])
@x = args[0]
@y = args[1]
@z = args[2]
end
end