Что map (&: name) делает в этом коде Ruby? - PullRequest
10 голосов
/ 05 марта 2010

Пытаясь немного лучше понять 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

Что меня особенно интересует, так это как events.map(&:name) работает? Я вижу, что события - это массив, и поэтому он вызывает метод map. Теперь мой вопрос: где блок, который передается на созданную карту? Что такое символ: имя в этом контексте? Я пытаюсь понять, как это работает.

1 Ответ

21 голосов
/ 05 марта 2010
events.map(&:name)

в точности эквивалентно

events.map{|x| x.name}

это просто удобный синтаксический сахар.

Для получения более подробной информации, проверьте метод Symbol#to_proc здесь . Здесь :name приводится к процедуре.

Кстати, это часто встречается здесь - просто очень трудно гуглить или иным образом искать «двоеточие с амперсандом»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...