【发布时间】:2012-03-17 03:14:44
【问题描述】:
Post.all.map(&:id)
将返回
=> [1, 2, 3, 4, 5, 6, 7, ................]
map(&:id) 是什么意思?尤其是&。
【问题讨论】:
-
感谢您以完全相同的形式关闭。这个问题有点难找。对不起。
标签: ruby-on-rails ruby activerecord
Post.all.map(&:id)
将返回
=> [1, 2, 3, 4, 5, 6, 7, ................]
map(&:id) 是什么意思?尤其是&。
【问题讨论】:
标签: ruby-on-rails ruby activerecord
& 符号用于表示应将以下参数视为赋予该方法的块。这意味着如果它还不是 Proc 对象,则将调用其to_proc 方法将其转换为一个。
因此,您的示例结果类似于
Post.all.map(&:id.to_proc)
相当于
Post.all.map { |x| x.id }
因此它遍历Post.all 返回的集合,并使用对每个项目调用的id 方法的结果构建一个数组。
这是有效的,因为Symbol#to_proc 创建了一个 Proc,它接受一个对象并调用带有符号名称的方法。主要是为了方便,省点打字。
【讨论】:
& 所做的是将 Proc 转换为块,如果操作数不是 Proc,则首先调用 to_proc,然后将结果转换为块。
&。
&x is the same as &x.to_proc”——除了定义是无限递归的。
& 表示你正在传递一个块
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
【讨论】:
这将获取所有Post 对象并创建一个数组,其中每个对象都调用id 方法。
换句话说,对于 ActiveRecord,这意味着您将获得一个具有 id 属性的数组,用于数据库中的所有 Post 实体。
【讨论】:
这是一个 Ruby 技巧,它依赖于 Ruby 进行一些动态类型转换。你可以找到Symbol#to_proc trick here的解释。
【讨论】: