2011-09-30 17 views
3

我來自java/c + +背景,我剛開始學習Ruby。我在理解連接到方法的塊時遇到問題。這是一種用於遷移數據庫的方法。Create_table方法/塊

create_table :model_names do |t| 
    t.string :name 
    t.string :address 
    t.timestamps 
end 

我的問題是:當我使用rake db:migrate命令。這是否調用create_table方法並將一個TableDefinition對象傳遞給它,我將其作爲| t |獲取並在我的塊中設置對象屬性?

回答

2

當你將一個塊傳遞給一個方法時,就像這裏的例子那樣,這個方法決定了如何以及如何使用這個塊。您需要閱讀方法的文檔和/或源代碼,以瞭解您的塊需要什麼參數(如果有)。

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 ... endbegin ... end有很大的區別。