【问题标题】:Method: Loop Through Arguments with Defaults方法:循环使用默认值的参数
【发布时间】:2015-04-26 22:15:09
【问题描述】:

我正在构建一个 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? 的某种组合),但总是有一个定义的预期实例变量列表,如果它们不是' t 定义。

【问题讨论】:

  • 您还会为这些变量添加 attr_reader 吗?
  • 是的,感谢您的提及!更新了上面的例子!

标签: ruby constructor instance-variables splat


【解决方案1】:

通常,初始化方法需要一大堆参数,这通常会导致使用选项哈希而不是 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

【讨论】:

  • 我最初实际上是在使用选项哈希,但因为我想定义所有可能的实例变量而停止了。我现在意识到,但是这有点像 Ruby 的方式来做到这一点。然而,我担心的是试图访问在初始化时未定义的变量。我是否通过尝试为所有这些变量定义默认值来接近这个错误?
  • 当然,这是一个常见的用例,我更新了我的答案以寻找一种处理方法。
  • 是的!合并默认值似乎正是我想要的!
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2012-08-04
相关资源
最近更新 更多