Ruby定义方法中关键字参数的散列上的splat运算符

时间:2018-08-14 18:57:03

标签: ruby ruby-2.5

我有一个这样的班级:

class AwesomeService
  attr_reader :a, :b

  def initialize(a: 30, b: 40)
    @a = a
    @b = b
  end
end

我正在尝试做这样的事情:

class AwesomeService
  DEFAULTS = {
    a: 30,
    b: 40
  }

  attr_reader *DEFAULTS.keys

  def initialize(**DEFAULTS)
    @a = a
    @b = b
  end
end

以便将默认值保留在单独的哈希中。

但是我得到了错误:

SyntaxError ((irb): syntax error, unexpected tCONSTANT, expecting ')')
  def initialize(**DEFAULTS)
                   ^~~~~~~~

似乎初始化中的splat运算符无法正常工作。但这似乎是合乎逻辑的做法。我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

是的...那不是你能做的。

**foo在参数列表中是您收集 kwargs散列的方式,因此也不可能是您注入的散列。

更重要的是,kwargs的要点是它们将散列爆炸为局部变量-如果它在运行时扩展散列,则无法使用。

您能得到的最接近的是:

def initialize(**values)
  values = DEFAULTS.merge(values)
  raise "..." unless (values.keys - DEFAULTS.keys).empty?
  @a = values[:a]
  @b = values[:b]
end