2013-07-11 51 views
0

例如,在軌道API 顯示信息如下:ruby​​文檔中的方法「原型」是如何解釋的?

form_tag(url_for_options = {}, options = {}, &block) 

從C++/JAVA背景編輯,這表明所有3個參數是必需的:兩個散列和塊。然而,這個方法有很多例子,使用少於三個參數,第一個參數採用字符串的形式。方法模板如何指定每個參數的特徵/類型以及哪些參數是必需的?是否有描述用於描述如何調用這些方法的約定的摘要文檔?

回答

0

通常沒有原型。在您的例子

form_tag(url_for_options = {}, options = {}, &block) 

form_tag方法最大的兩個參數預期,但由於默認值是對他們倆的供給可以不帶任何參數都被調用。如果使用比已指定的參數多的參數調用方法,則會引發ArgumentError,或者參數比沒有默認值的參數更少。

任何默認參數值的類型與調用該方法時可能傳遞的內容無關,而像form_tag(Math::PI, false)這樣的調用雖然不太可能做任何有用的事情,但編譯得很好。

在形式參數中指定塊只會給予調用中提供的任何塊的命名訪問權。在該方法中使用yield來執行塊並將值傳入或傳出通常更合適。一個塊是總是當該方法被調用時可選。

0

在Ruby中,只有在方法原型中沒有賦予默認值且不是塊的情況下才需要方法原型中的參數。塊總是可選的(儘管它們在方法實現方面可能不是可選的)。考慮以下幾點:

def foo(bar, baz = nil, bin = :bang, &block) 

在這個例子中,需要bar,因爲如果它不分配不接受默認值。如果您不想指定更多參數,則不需要 - baz將分配爲nil,而bin將分配爲:bang

您只能傳遞foobaz的值,忽略bin並讓它接收其默認值:foo(:some_bar, :some_baz)

如果你想傳遞一個值bin,但不適合baz,您遇到問題,雖然 - 紅寶石會不會讓你通過值參數1 & 3,跳過2.爲了達到說法3,您需要傳遞參數2,因此您的調用可能是foo(:some_bar, nil, :boom)

如上所述,塊總是可選的。在語義上,可能需要一個塊。舉例來說,如果你有

def foo(&block) 
    yield 
end 

你調用FOO沒有一個塊,您會收到LocalJumpError: no block given (yield)。如果你的方法需要一個塊來運行,那麼這可能是合適的,因爲它告訴用戶他們沒有通過一個塊。但是,如果塊可以是可選的,那麼您可以測試是否通過了block_given?,因此您可以根據是否傳遞參數來調整方法的實現。