ruby方法定义中关键字参数哈希上的splat运算符

ruby方法定义中关键字参数哈希上的splat运算符,ruby,ruby-2.5,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

我有一门课是这样的:

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
我正在尝试这样做:

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操作符似乎没有像我预期的那样工作。但这似乎是合乎逻辑的做法。我做错了什么?

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

**foo
在参数列表中是如何收集kwargs散列的,所以不能同时也是如何注入一个

更重要的是,kwargs的要点是它们将散列分解为局部变量——如果它在运行时扩展散列,则无法工作

最接近的可能是:

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

嗯,这很有道理。我省略了代码的raise部分,因为我不介意有人将不存在的键传递给该方法。