當你將一個塊傳遞給一個方法時,就像這裏的例子那樣,這個方法決定了如何以及如何使用這個塊。您需要閱讀方法的文檔和/或源代碼,以瞭解您的塊需要什麼參數(如果有)。
在create_table
的情況下,準備一個對象並通過create_table
方法本身傳遞給您。 rake
和相關的任務在這一點上與它無關,它們只被用作啓動機制。
要記住的是Ruby的塊可以被稱爲零次或多次是很重要的,無論是立即或將來。這意味着您不能確定您的區塊是否會馬上被調用,稍後或永遠不會調用,或者調用多少次。您可以擁有的唯一期望是通過您發送該塊的方法建立的。
您甚至可以將塊傳遞給不需要它們的方法,因爲該方法不會使用yield
執行塊。
塊首先可能有點混亂,除非你來自具有類似構造的語言。 JavaScript程序員將熟悉傳入function
對象,這基本上就是你在這裏做的所有事情,儘管在Ruby中它是一個Proc,它被作爲一個隱含的參數發送。
在更多的JavaScript有味的例子,這看起來像:
create_table('model_names', function(t) {
t.string('name');
t.string('address');
t.timestamps();
});
闡明這樣很明顯你只是在一個函數發送,這是達create_table
函數來執行它。 Ruby的結構是這樣的,一眼就可以看出這個塊立即被執行,但是聲明一個塊與do ... end
和begin ... end
有很大的區別。