我有一个这样的班级:
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运算符无法正常工作。但这似乎是合乎逻辑的做法。我在这里做什么错了?
答案 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