[英]Can this Ruby method call be made without **{} at the end?
我有一個像這樣定義的方法:
def woot(a = nil, b: nil)
...
end
將Hash
實例傳遞a
何時省略b
是什么?
我試過了
woot(x: 1)
woot({x: 1})
h = {x: 1}
woot(h)
但他們都提高了
ArgumentError: unknown keyword: x
打電話的唯一方法是我弄清楚了
woot({x: 1}, **{})
有更好的方法嗎?
您的第一個參數是可選的,因此Ruby假定您傳遞的哈希是針對命名參數(*)。
我不認為有更好的解決方法,雖然這有點短(但不一定更清潔):
woot({x: 1}, {})
如果我是你,我會改變方法簽名來解決歧義。
(*):好吧,並非總是: woot({1=>3})
會愉快地將哈希傳遞給第一個可選參數。
甚至更奇怪,如果是woot({1=> 5, :b => 4})
,Ruby將拆分字典,並將{1=>5}
傳遞給第一個可選參數。
看起來它首先嘗試獲取命名參數 (並且會抱怨不存在的名稱),然后將其余參數傳遞給可選參數。
但我很樂意看到一些語言律師的解釋......
如果你不希望b
的默認值改變, 永遠 ,怎么樣傳遞明確?
woot({x: 1}, b: nil)
當然,如果b
的默認值確實改變了一天,你仍然會傳遞nil
,從而將該調用的b
值覆蓋到其新的默認值以外的其他值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.