1

次のコードを DRY して、2 番目のイニシャライザから最初のイニシャライザを呼び出す方法は?

class DataStream

  attr_reader :asset
  attr_reader :data

  def initialize(asset)
    @asset = asset
    @data = Array.new
  end

  def initialize(asset, values)
    @asset = asset
    @data = Array.new
    values.each do |value|
      add_value(value)
    end
  end

end
4

4 に答える 4

3

同じ名前のメソッドを 2 つ定義することはできません。定義した場合、メソッドを再定義したような、最後のメソッドのみが実行されます。

次のようなオプションのパラメーターを使用できます。

def initialize(asset, values = nil)
    @asset = asset
    @data = Array.new
    values.each do |value|
        add_value(value)
    end if values
end
于 2012-06-21T05:45:10.167 に答える
2

デフォルトの引数を使用します。

def initialize(asset, values = [])
  @asset = asset
  @data = Array.new
  values.each do |value|
    add_value(value)
  end
end
于 2012-06-21T05:46:39.243 に答える
1

警告を使用すると、Ruby は既存のメソッドを再定義したため、それ以上使用できないことを通知します。

$VERBOSE = true
class DataStream

  attr_reader :asset
  attr_reader :data

  def initialize(asset)
    @asset = asset
    @data = Array.new
  end

  def initialize(asset, values)
    @asset = asset
    @data = Array.new
    values.each do |value|
      add_value(value)
    end
  end
end

与える

(irb):12: warning: method redefined; discarding old initialize
(irb):7: warning: previous definition of initialize was here
于 2012-06-21T06:22:19.403 に答える
1

どうですか :

class DataStream
  attr_reader :asset
  attr_reader :data
  def initialize(asset, values=nil)
    @asset=asset
    @data = Array.new
    values.each{|v| add_value(v)} unless values.nil?
  end
end
于 2012-06-21T05:47:11.140 に答える