0

initializeメソッドの引数のデフォルトを持つ Ruby オブジェクトを作成しています。

attr_accessor :one, :two, :three

def initialize(one: nil, two: nil, three: nil)
  @one = one
  @two = two
  @three = three
end

ご覧のとおり、特に初期化可能な変数の数が増えるにつれて、これはあまり DRY ではありません。最終的には、各引数をループしてインスタンス変数 (splat 演算子と ? の組み合わせ) を割り当てることができるようにしたいと考えてinstance_variable_setいますが、定義されていない場合は、期待されるインスタンス変数の定義済みリストをデフォルトで常に持っています。

4

1 に答える 1

5

通常、initialize メソッドに多数の引数が必要な場合は、splat ではなくオプション ハッシュを使用することになります。

options ハッシュを使用すると、initialize メソッドを完全に削除し、インスタンス変数と attr_readers を非常に ruby​​ な方法で設定できます。

class Animal
  def initialize(opts = {})
    options = defaults.merge(opts)
    options.each do |k, v|
      instance_variable_set("@#{k}", v)
      self.class.send(:attr_reader, k)
    end
  end

  private

  def defaults
    {
      type: nil,
      age: 100,
      name: "Unknown"
    }
  end
end

animal = Animal.new(type:'cat', age: 99)
puts animal
puts animal.type
puts animal.age
puts animal.name

出力:

#<Animal:0x007f9773132650>
cat
99
Unknown
于 2015-02-25T02:55:00.693 に答える