2014-01-06 224 views
0

前省略默認參數有了方法簽名紅寶石 - 圖示

def invalidate_cache(suffix = '', *args) 
    # blah 
end 

我不知道這是可能的,但我想打電話給invalidate_cache有時省略第一個參數,例如以下:

middleware.invalidate_cache("test:1", "test") 

這當然會將第一個參數綁定到後綴,第二個參數綁定到args。

我想這兩個參數被束縛成參數,而無需調用是這樣的:

middleware.invalidate_cache("", "test:1", "test") 

是否有辦法解決這?

+1

您將如何編碼*有時省略第一個參數,例如:*運行時間? –

回答

3

使用關鍵字參數(這部作品在紅寶石2.0+):

def invalidate_cache(suffix: '', **args) # note the double asterisk 
    [suffix, args] 
end 

> invalidate_cache(foo: "any", bar: 4242) 
=> ["", {:foo=>"any", :bar=>4242}] 

> invalidate_cache(foo: "any", bar: 4242, suffix: "aaaaa") 
=> ["aaaaa", {:foo=>"any", :bar=>4242}] 

注意,您將有可變參數的哈希,而不是一個數組和密鑰被限制爲有效符號。

如果您需要按位置引用參數,請使用Hash#values從哈希創建一個數組。

+1

Fyi,關鍵字參數僅在Ruby v2.0 +中受支持。 – Ajedi32

+0

@ Ajedi32:謝謝,我更新了答案。 – karatedog

0

您如何爲invalidate_cache創建一個包裝方法,該方法只需將invalidate_cache與後綴的標準參數一起調用即可。

0

爲了做到這一點,你的代碼必須有一些方法來區分一個後綴和另一個args的區別。例如。在你的第一個例子中,你的程序應該如何知道你不是指"test:1"實際上是後綴?

如果你可以回答這個問題,你可以編寫一些代碼來讓該方法在運行時確定你是否提供了後綴。例如,假設您指定所有後綴都必須以句點開頭(並且不會有其他參數)。然後,你可以做這樣的事情:

def invalidate_cache(*args) 
    suffix = (args.first =~ /^\./) ? args.shift : '' 
    [suffix, args] 
end 

invalidate_cache("test:1", "test") #=> ["", ["test:1", "test"]] 
invalidate_cache(".jpeg", "test:1", "test") #=> [".jpeg", ["test:1", "test"]] 

但是,如果實際上有沒有告訴差異之間的爭論意味着作爲後綴,一個意味着要集中在args的方式,那麼你樣卡住了。您要麼必須顯式傳遞後綴,更改方法簽名以使用關鍵字參數(詳見karatedog's answer),要麼採用選項哈希。