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

hey*_*ike 42 ruby activerecord ruby-on-rails

可能重复:
map(&:name)在Ruby中意味着什么?

Post.all.map(&:id) 
Run Code Online (Sandbox Code Playgroud)

将返回

 => [1, 2, 3, 4, 5, 6, 7, ................] 
Run Code Online (Sandbox Code Playgroud)

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

Nik*_* B. 81

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

因此,您的示例会产生类似的结果

Post.all.map(&:id.to_proc)
Run Code Online (Sandbox Code Playgroud)

而这相当于

Post.all.map { |x| x.id }
Run Code Online (Sandbox Code Playgroud)

因此,它迭代返回的集合Post.all并构建一个数组,并id在每个项目上调用该方法的结果.

这是有效的,因为Symbol#to_proc创建了一个Proc,它接受一个对象并使用其上的符号名称调用该方法.它主要用于方便,节省一些打字.

  • 这不是真的.map(:id.to_proc)将抛出ArgumentError,因为map不接受任何参数.传递Proc作为参数**不是**与提供块相同.什么`&`它将Proc转换为块,如果操作数不是Proc,它首先调用to_proc然后将结果转换为块. (5认同)

And*_*lin 5

&表示你正在传递一个块

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

Post.all.map { |item| # do something }
Run Code Online (Sandbox Code Playgroud)

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