比方說,我有一個默認的關鍵字參數有沒有一種方法可以在Ruby中顯式喚起默認的關鍵字參數?
def foo(bar: "baz")
bar
end
有沒有辦法來調用foo
與關鍵字參數,但仍調用無論是默認的功能?例如,一種使這項工作的方法?
foo(bar: :default)
#=> "baz"
或者,有沒有辦法,看看有什麼方法的默認參數是從該方法中?
比方說,我有一個默認的關鍵字參數有沒有一種方法可以在Ruby中顯式喚起默認的關鍵字參數?
def foo(bar: "baz")
bar
end
有沒有辦法來調用foo
與關鍵字參數,但仍調用無論是默認的功能?例如,一種使這項工作的方法?
foo(bar: :default)
#=> "baz"
或者,有沒有辦法,看看有什麼方法的默認參數是從該方法中?
這比您想象的要容易。只是不指定它:
foo
# => "baz"
默認值只適用於那些沒有明確指定的值。作爲一個說明,這意味着,在這種情況下,你要替換它:
foo(bar: nil)
# => nil
這就是爲什麼我一般都儘量寫這種形式的方法:
def foo(bar: nil)
bar or 'baz'
end
這樣,你可以放心,沒有不管你得到什麼回報價值。
你可以這樣做:
def foo(bar = "baz")
args = method(__method__).parameters // This will give current methods argument info.
bar
end
不幸的是,這隻給出關鍵字參數名稱而不是默認值。 –
這種方法很有趣,但它只描述了所需的參數,而不是它們的默認值。我認爲這可能,但不是。 – tadman
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
私人。
是的,但有沒有辦法顯式調用任何默認值,或者即使參數傳入時也可以看到默認值是什麼? 將默認設置爲零,然後用一個或者語句覆蓋看起來好像它可能是最好的方式去,如果它不可能,謝謝你的答案! –
這不是核心Ruby標準的一部分,但是如果你絕對必須知道的話,有辦法做到這一點。我強烈建議不要使用任何[黑客](http://stackoverflow.com/questions/622324/getting-argument-names-in-ruby-reflection)。通常'= nil'或'x:nil'符號對任何使用你的庫的人來說都是「可選的」,並且有一個預期將被應用。這個默認值可以手動記錄,也可以不相關,因爲只要他們得到預期的結果,它不涉及調用者。在這裏,*做我的意思*的原則適用於足夠接近的地方。 – tadman
謝謝,我會牢記這一點。我正在測試Ruby中元編程的合理性限制。我希望沒有人會需要觸摸這種方法:) –