Post.all.map(&:id) 是啥意思? [复制]

Posted

技术标签:

【中文标题】Post.all.map(&:id) 是啥意思? [复制]【英文标题】:What does Post.all.map(&:id) mean? [duplicate]Post.all.map(&:id) 是什么意思? [复制] 【发布时间】:2012-03-17 03:14:44 【问题描述】:

可能重复:What does map(&:name) mean in Ruby?

Post.all.map(&:id) 

将返回

 => [1, 2, 3, 4, 5, 6, 7, ................] 

map(&:id) 是什么意思?尤其是&

【问题讨论】:

感谢您以完全相同的形式关闭。这个问题有点难找。对不起。 【参考方案1】:

& 符号用于表示应将以下参数视为赋予该方法的块。这意味着如果它还不是 Proc 对象,则将调用其to_proc 方法将其转换为一个。

因此,您的示例结果类似于

Post.all.map(&:id.to_proc)

相当于

Post.all.map  |x| x.id 

因此它遍历Post.all 返回的集合,并使用对每个项目调用的id 方法的结果构建一个数组。

这是有效的,因为Symbol#to_proc 创建了一个 Proc,它接受一个对象并调用带有符号名称的方法。主要是为了方便,省点打字。

【讨论】:

这不是真的。 map(:id.to_proc) 将抛出 ArgumentError 因为 map 不接受任何参数。将 Proc 作为参数传递与提供块相同。 & 所做的是将 Proc 转换为块,如果操作数不是 Proc,则首先调用 to_proc,然后将结果转换为块。 @sepp2k:是的,我忘记了& 你的第一句话也应该是“&x is the same as &x.to_proc”——除了定义是无限递归的。 @sepp2k:我已经删除了那部分。【参考方案2】:

& 表示你正在传递一个块

Post.all 是方法 .map 的接收者,它的块正在被传递

Post.all.map  |item| # do something 

http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map

它遍历数组并使用符号#to_proc 创建一个 lambda

http://ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc

【讨论】:

【参考方案3】:

这将获取所有Post 对象并创建一个数组,其中每个对象都调用id 方法。

换句话说,对于 ActiveRecord,这意味着您将获得一个具有 id 属性的数组,用于数据库中的所有 Post 实体。

【讨论】:

【参考方案4】:

这是一个 Ruby 技巧,它依赖于 Ruby 进行一些动态类型转换。你可以找到Symbol#to_proc trick here的解释。

【讨论】:

以上是关于Post.all.map(&:id) 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中,对具有唯一 ID 的对象进行复制/移动/分配的正确方法是啥?

android studio中的代码是啥[关闭]

& 是啥意思。 (& 点)在 Ruby 中是啥意思?

android api 签名是啥意思

=> 在 oracle pl sql.is 和调用运算符中是啥意思?

shell命令中“&&”的目的是啥?