2015-01-07 30 views
4

啪擴大在方法調用中的空數組有效地降低了參數沒有(空括號添加清晰度):我怎樣才能將雙摔跤參數摺疊成什麼?

def foo() 
end 

def bar(*args) 
    foo(*args) 
end 

bar(1) # ArgumentError, as expected 
bar() # works 

但同樣不適用於哈希的說法:

def baz() 
end 

def qux(**opts) 
    baz(**opts) 
end 

qux # ArgumentError, **opts becomes {} 

我可以解決此通過一個空的哈希顯式檢查:

def quux(callable, **opts) 
    if opts.empty? 
    callable.() 
    else 
    callable.(**opts) 
    end 
end 

c = ->{} 
quux(c) # works 

但有一個更好的/更好的方式來做到這一點,或者是一個變化t o此行爲計劃?在編寫barqux時,我不知道foobaz的簽名,因爲後者是工廠類構造函數包裝的一部分。

+2

爲什麼你需要使用'** opts'? '* args'也應該和關鍵字參數一起工作。 –

+3

我考慮的時間越長,我認爲這可能實際上是Ruby中的一個錯誤。如果'foo(* [])'起作用,'baz(** {})'也應該起作用。 –

+0

@PatrickOscity使用參數的好處。不知何故忘了。我今天學會了雙splat語法,並且可能成爲一個有點專注於使用它的方面。對於我剛剛嘗試過的每個案例,只需使用'* args'即可,包括可選關鍵字和必需關鍵字參數的混合。所以我現在不需要這個工作。但我仍然同意你的第二個評論,我認爲這是不直觀的,也可能是無意的。我會在bug追蹤器上尋找它並提交報告。 – Kolja

回答

0

嘗試以下:

def baz() 
end 

def qux(**opts) 
    baz(*opts) 
end 

qux 

要多看一些關於哈希是如何工作的*試試下面的:

h = {} 
puts h # {} 
puts *h # nothing output 
puts **h #{}