我来自java / c ++背景,我刚开始学习Ruby。我在理解附加到方法的块时遇到问题。这是用于迁移数据库的方法。
create_table :model_names do |t|
t.string :name
t.string :address
t.timestamps
end
我的问题是:当我使用rake db:migrate命令时。这是否调用create_table方法并将TableDefinition对象传递给它,我将其作为| t |并在我的块中设置该对象属性?
答案 0 :(得分: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 ... end
和begin ... end
声明块之间存在很大差异。