gpt4 book ai didi

ruby-on-rails - Create_table 方法/ block

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:49 24 4
gpt4 key购买 nike

我有 java/c++ 背景,刚开始学习 Ruby。我在理解附加到方法上的 block 时遇到问题。这是一种用于迁移数据库的方法。

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

我的问题是:当我使用 rake db:migrate 命令时。那会调用 create_table 方法并将 TableDefinition 对象传递给它吗,我将其抓取为 |t|并在我的 block 中设置该对象属性?

最佳答案

当您将一个 block 传递给一个方法时,就像这里的示例中的情况一样,由方法决定如何以及是否使用该 block 。您将需要阅读该方法的文档和/或源代码,以了解您的模块需要哪些参数(如果有)。

create_table 的情况下,一个对象由 create_table 方法本身准备并传递给您。 rake 和相关任务此时与它无关,它们仅用作启动机制。

请务必记住,Ruby block 可以被调用零次或多次立即或将来。这意味着您无法确定您的 block 是否会立即、稍后或永远不会被调用,或者它会被调用多少次。您唯一可以拥有的期望是由您将 block 发送到的方法建立的。

您甚至可以将 block 传递给不需要它们的方法,因为该方法永远不会以 yield 执行您的 block 。

除非您来自具有类似构造的语言,否则 block 一开始可能会有点困惑。 JavaScript 程序员会熟悉传递 function 对象,这基本上就是您在这里所做的所有事情,尽管在 Ruby 术语中它是作为隐式参数发送的 Proc。

在一个更具 JavaScript 风格的示例中,这看起来像:

create_table('model_names', function(t) {
t.string('name');
t.string('address');
t.timestamps();
});

像这样拼写很明显,您只是在发送一个函数,由 create_table 函数来执行它。 Ruby 的结构乍一看似乎是立即执行该 block ,但是使用 do ... endbegin 声明 block 之间存在很大差异...结束

关于ruby-on-rails - Create_table 方法/ block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7615339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com