簡體   English   中英

這個Ruby方法調用最終可以不用** {}嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM