2009-05-24 77 views
2

我目前正在學習Ruby和回報率和我碰到這個聲明偶然:爲什麼這些默認參數是這樣定義的?

link_to_remote(name, options = {}, html_options = nil) 

我發現,這種模式在其他幾個Rails的功能使用。

爲什麼默認值是這樣定義的?爲什麼不是這兩個之一?

... options = {}, html_options = {}) 
... options = nil, html_options = nil) 

這是我在自己的功能中應該遵循的某種約定嗎?

回答

1

的方法是這樣定義的零錯誤:

link_to_function(name, remote_function(options), html_options || options.delete(:html)) 

這允許您指定html_optionsoptions哈希的一部分,而不是作爲一個單獨的參數。另一方面,options散列總是傳遞給remote_function,所以我們需要它。

使用單例nil而不是構造一個永遠不會在每次調用該方法時都會使用的數組的情況下效率也會更高。我不會說這個理由非常有說服力,如果它使得結果代碼更清潔,我不會使用{},但是在沒有任何其他考慮的情況下,它似乎是合乎邏輯的事情。

0

不是專家,但對於options,這可能是因爲調用代碼使用merge方法將您傳遞的任何內容與假定的默認值進行組合;將其設置爲nil只會刪除所有選項。我不確定html_options,但它可能與此類似。

html_options可能會調用一個塊並定義一些東西來檢查它是否被給予散列。就像我說的我不是專家,但這可能是爲什麼。我剛剛檢查了一個Ubuntu虛擬機,根據irb,一個空的哈希計算結果爲true,所以這可能是爲什麼。調用代碼可能使用塊的東西線:

if html_options 
    # do stuff 
end 

所以它的nil在默認情況下,因爲代碼將執行,並可能給你一個空哈希

相關問題