gpt4 book ai didi

ruby-on-rails - Rails create_table 是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:19 25 4
gpt4 key购买 nike

Rails 相比,这更像是一个 Ruby 问题。

函数签名:

def create_table(table_name, comment: nil, **options)
...
end

用法:

create_table(:suppliers) do |t|
t.string :name, limit: 60
# Other fields here
end

给定 create_table 的函数签名,用法如何映射到它?

例如,:suppliers映射到table_nameblock如何映射到函数签名?

我也明白 * 是一个接受 x 个参数的 splat。** 是一个 double splat(我认为),它接受 x 个哈希值(即键值对)。

所以我不确定 **options 是否与 block 的传递有关。

引用:http://api.rubyonrails.org/v5.1/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-create_table

最佳答案

每个 Ruby 方法还采用签名中不需要的隐式 block 参数。如果您研究 create_table 的方法主体,您会发现:yield td if block_given?

这意味着:如果给定(或提供)了一个 block ,调用隐式 block 使用 td 局部变量作为 block 参数(在你的代码中是 t示例)。

只要您不需要直接访问提供的 block ,就不需要将该 block 作为方法参数。如果您需要它,您可以将其声明为方法参数,如下所示:

def create_table(table_name, comment: nil, **options, &block)
# do something with block
end

除了使用隐式方法 block 参数并调用 yield td,您还可以使用显式方法 block 参数并调用 block.call(td)。 ruby 实现在这两者之间有所不同,yield 可能总是更快。

你是对的:*args 用于 splat 参数,其中 args 将是方法主体中的参数数组。 **kwargs(或此处的**options)用于关键字参数,其中kwargs(或options)将是方法主体中参数的散列。

关于ruby-on-rails - Rails create_table 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44743793/

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