map(&:name)在这个Ruby代码中做了什么?

ran*_*its 10 ruby ruby-on-rails

为了更好地理解Ruby,我遇到了上网冲浪的代码:

require 'rubygems'
require 'activeresource'



ActiveResource::Base.logger = Logger.new("#{File.dirname(__FILE__)}/events.log")

class Event < ActiveResource::Base
  self.site = "http://localhost:3000"
end

events = Event.find(:all)
puts events.map(&:name)

e = Event.find(1)
e.price = 20.00
e.save

e = Event.create(:name      => "Shortest event evar!", 
                 :starts_at => 1.second.ago,
                 :capacity  => 25,
                 :price     => 10.00)
e.destroy
Run Code Online (Sandbox Code Playgroud)

我特别感兴趣的是如何events.map(&:name)工作?我看到事件是一个数组,因此它正在调用它的map方法.现在我的问题是,传递给地图的块在哪里创建?符号是什么:在这种情况下的名称?我试图了解它是如何工作的.

Pet*_*ter 21

events.map(&:name)
Run Code Online (Sandbox Code Playgroud)

完全等同于

events.map{|x| x.name}
Run Code Online (Sandbox Code Playgroud)

它只是方便的语法糖.

有关更多详细信息,请查看此处Symbol#to_proc方法.在这里,正被强迫进程.:name

顺便说一下,这经常出现在这里 - 谷歌或其他搜索'带有&符'的冒号的东西是非常困难的:).

  • 也许,既然你已经提到过"带有&符号的冒号",它就会开始被拾起:) (3认同)