0

一部のコードを他の言語からRubyに移植しています。クラスでは、これら4つのコンストラクターとの互換性を維持する必要があります。

def initialize(b)
def initialize(a, b)
def initialize(b, c)
def initialize(a, b, c)

私はこの方法を試していましたが、機能しません:

def initialize(a="", b, c="")

スマートな解決策はありますか?ハッシュは使えません。

4

3 に答える 3

2

ハッシュを使用できず(なぜですか?)、それらがメソッドでなければならない場合は、運が悪い可能性があります。initialize入力や位置情報がなければ、たとえば配列を分解して、どの引数がどれであるかを判断する方法はありません。

IMOが最もクリーンなのは、構築を行い、コンストラクター(この場合はファクトリ)に固有の引数を受け入れるクラスメソッドを提供することです。

引数のタイプが異なる場合は、その情報を使用して、渡される値を判別できますが、IMOはかなり醜くなります。

于 2012-06-22T16:35:22.920 に答える
2

が完全に異なるタイプであり、常にそうなる場合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

于 2012-06-22T16:58:56.167 に答える
0

これは解決策かもしれませんが、まあそれは醜いです!

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
于 2012-06-22T17:29:58.823 に答える