Create_table方法/块

时间:2011-09-30 19:47:22

标签: ruby-on-rails ruby activerecord

我来自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 |并在我的块中设置该对象属性?

1 个答案:

答案 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 ... endbegin ... end声明块之间存在很大差异。