![](/img/trans.png)
[英]Ruby automatically expands Hash into keyword arguments without double splat
[英]splat operator on hash for keyword arguments in ruby method definition
我有這樣的課:
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哈希的方法。
更重要的是,kwargs的要點是它們將散列分解為局部變量-如果它在運行時擴展散列,則該散列將不起作用。
您能得到的最接近的是:
def initialize(**values)
values = DEFAULTS.merge(values)
raise "..." unless (values.keys - DEFAULTS.keys).empty?
@a = values[:a]
@b = values[:b]
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.