ruby 方法定义中关键字参数哈希的 splat 运算符
splat operator on hash for keyword arguments in ruby method definition
我有一个 class 这样的:
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
我有一个 class 这样的:
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