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 的对象进行复制/移动/分配的正确方法是啥?