2011-09-30 4 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のブロックは0回以上呼び出すことができることを心に留めておくことが重要ですすぐまたは将来のいずれかで。これは、ブロックがすぐに呼び出されるか、後で呼び出されるか、決して呼び出されないか、呼び出される回数がわからないことを意味します。唯一期待できることは、ブロックを送信する方法によって確立されます。

ブロックがyieldでブロックされていないので、何も起こらない場所にブロックを渡すことさえできます。

類似の構文を持つ言語に由来しない限り、ブロックは最初は少し混乱する可能性があります。 JavaScriptプログラマは、functionオブジェクトを渡すことに精通しています。これは基本的にここでやっているすべてのものですが、Ruby用語では暗黙の引数として送られるProcです。それはあなたが単に機能で送信していて、それを実行するためにcreate_table機能次第です明らかだ

次のように綴ら
create_table('model_names', function(t) { 
    t.string('name'); 
    t.string('address'); 
    t.timestamps(); 
}); 

よりJavaScriptの風味の例では、これは次のようになります。 Rubyはブロックがすぐに実行されるように見えるかもしれないが、ブロックの宣言にはdo ... endbegin ... endの間に大きな違いがあるというような仕方で構築されている。

関連する問題