-1

私はこのようなクラスを持っています:

class Equipment

    attr_reader :text
    attr_reader :name
    attr_reader :array1
    attr_reader :number

end

次に、それぞれ 3 つのパラメーターを持つ 2 つのコンストラクターを作成します。

1º one -> (text,name,array1)

2º one -> (テキスト、名前、番号)

引数としての最初のものには配列があり、もう一方には整数(1,2 ...)があるため、両方のコンストラクターを定義する必要があるため、このクラスのオブジェクトを作成すると、配列または整数の違いが生じます3度の引数。

何か案は?

編集:私はこれを考えました:

def initialize(text = "", name = "", array = array.new, number =0)

    @text = text
    @name = name
    @array1 = array
    @number = number

end

(それらすべてを初期化します)次に:

def Equipment.newc_witharray(sometext, somename, somearray)

    @text = sometext
    @name = somename
    @array1 = somearray

end

def Equipment.newc_withint(sometext, somename, somenumber)

    @text = text
    @name = name
    @number = somenumber

end

最後に、次のようにオブジェクトを呼び出します。

character1 = Equipment.newc_withint("Barbarian", "conan", 3)

これはうまくいくべきではありませんか?

4

4 に答える 4

3

好きな名前のクラスで必要な数のコンストラクターを作成できます。newから継承されObject、他のコンストラクターを記述するために使用できるコンストラクターが 1 つあります。コンストラクターとして言及されている他の回答、つまりインスタンスメソッドinitializeはコンストラクターではありません。これは、デフォルトでコンストラクター メソッドnewによって呼び出されるメソッドです。

class Foo
  def self.new1 text, name, array1
    obj = new
    # do something on obj with text, name, array1
    obj
  end
  def self.new2 text, name, number
    obj = new
    # do something on obj with text, name, number
    obj
  end
end

Foo.new1(text, name, array1)
Foo.new2(text, name, number)
于 2013-10-16T20:50:00.877 に答える
0

実行時まで型がわからないため、Ruby インタープリターはコンストラクターを区別できません :(

ただし、非常に優れた回避策を使用できます。

class Foobar
  def initialize(h)  # <-- h is a hash
    # pass combination of params into the hash, do what you like with them
  end
end

次に、このパターンを使用して、パラメーターの任意の組み合わせをコンストラクターに渡すことができます。

foobar = Foobar.new(:foo => '5', :bar => 10, :baz => 'what?')
于 2013-10-16T20:42:10.250 に答える
0

言語に組み込まれています。いいえ、Ruby はその機能を提供しません。

ただし、その機能が必要な場合initializeは、ハッシュをパラメーターとして受け取るメソッドを作成します。次に、任意の数のパラメーターを使用してクラスのインスタンスを作成できます。

例えば:

class Equipment
  attr_reader :text, :name, :array1, :number

  def initialize(options)
    [:text, :name, :array1, :number].each do |sym|
      self.send(sym) = options[sum]
    end
  end
end
于 2013-10-16T20:39:05.073 に答える