Post.all.map(&:id)是什么意思?

时间:2012-02-27 16:32:56

标签: ruby-on-rails ruby activerecord

  

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

Post.all.map(&:id) 

将返回

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

map(&:id)是什么意思?特别是&

4 个答案:

答案 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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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