2016-08-25 23 views

回答

2

這比您想象的要容易。只是不指定它:

foo 
# => "baz" 

默認值只適用於那些沒有明確指定的值。作爲一個說明,這意味着,在這種情況下,你要替換它:

foo(bar: nil) 
# => nil 

這就是爲什麼我一般都儘量寫這種形式的方法:

def foo(bar: nil) 
    bar or 'baz' 
end 

這樣,你可以放心,沒有不管你得到什麼回報價值。

+0

是的,但有沒有辦法顯式調用任何默認值,或者即使參數傳入時也可以看到默認值是什麼? 將默認設置爲零,然後用一個或者語句覆蓋看起來好像它可能是最好的方式去,如果它不可能,謝謝你的答案! –

+1

這不是核心Ruby標準的一部分,但是如果你絕對必須知道的話,有辦法做到這一點。我強烈建議不要使用任何[黑客](http://stackoverflow.com/questions/622324/getting-argument-names-in-ruby-reflection)。通常'= nil'或'x:nil'符號對任何使用你的庫的人來說都是「可選的」,並且有一個預期將被應用。這個默認值可以手動記錄,也可以不相關,因爲只要他們得到預期的結果,它不涉及調用者。在這裏,*做我的意思*的原則適用於足夠接近的地方。 – tadman

+0

謝謝,我會牢記這一點。我正在測試Ruby中元編程的合理性限制。我希望沒有人會需要觸摸這種方法:) –

-2

你可以這樣做:

def foo(bar = "baz") 
    args = method(__method__).parameters // This will give current methods argument info. 
    bar 
end 
+1

不幸的是,這隻給出關鍵字參數名稱而不是默認值。 –

+0

這種方法很有趣,但它只描述了所需的參數,而不是它們的默認值。我認爲這可能,但不是。 – tadman

1

tadman已經explained,你無法通過Ruby的內置反射API檢索方法的默認參數。

但是,您可以簡單地提取默認值到它自己的方法:

def default 
    'baz' 
end 

def foo(bar: default) 
    p bar: bar, default: default 
end 

foo 
# {:bar=>"baz", :default=>"baz"} 

foo(bar: nil) 
# {:bar=>nil, :default=>"baz"} 

另外,你可以做default私人。

相關問題