1

我有这样的课:

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 运算符没有按我预期的那样工作。但这似乎是这样做的合乎逻辑的方式。我在这里做错了什么?

4

1 回答 1

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
于 2018-08-14T19:04:49.203 回答