0

我正在构建一个 Ruby 对象,该对象在其initialize方法中具有默认参数:

attr_accessor :one, :two, :three

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

如您所见,这不是很干燥,尤其是随着可初始化变量的数量增加。最终,我希望能够遍历每个参数并分配一个实例变量(splat 运算符和instance_variable_set?的某种组合),但如果未定义,则始终具有已定义的具有默认值的预期实例变量列表。

4

1 回答 1

5

通常,初始化方法需要一大堆参数通常会导致使用选项哈希而不是 splat。

使用选项散列,您可以干掉您的初始化方法,以非常红宝石的方式设置实例变量和 attr_readers:

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 回答