Post.all.map(&:id)
将返回
=> [1, 2, 3, 4, 5, 6, 7, ................]
map(&:id)
是什么意思?特别是&
。
答案 0 :(得分:80)
&
符号用于表示以下参数应被视为给予方法的块。这意味着如果它还不是Proc对象,则会调用其to_proc
方法将其转换为一个。
因此,您的示例会产生类似
的内容Post.all.map(&:id.to_proc)
反过来相当于
Post.all.map { |x| x.id }
因此它迭代Post.all
返回的集合,并构建一个数组,其中每个项目调用id
方法的结果。
这是有效的,因为Symbol#to_proc
创建一个Proc,它接受一个对象并使用其上的符号名称调用该方法。它主要用于方便,节省一些打字。
答案 1 :(得分:5)
&安培;意味着你正在传递一个块
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答案 2 :(得分:2)
这将获取所有Post
个对象并创建一个数组,并在每个对象上调用id
方法。
换句话说,对于ActiveRecord,这意味着您将获得数据库中所有id
个实体的Post
属性的数组。
答案 3 :(得分:1)
这是一个Ruby技巧,它依赖于Ruby进行一些动态类型转换。您可以找到Symbol#to_proc trick here的解释。