Пытаясь понять 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)
работа? Я вижу, что события являются массивом, и таким образом он вызывает свой метод карты. Теперь мой вопрос, где блок, это передается созданной карте? Что является символом: имя в этом контексте? Я пытаюсь понять, как это работает.
events.map(&:name)
точно эквивалентен
events.map{|x| x.name}
это просто удобный синтаксический сахар.
Для получения более подробной информации ознакомьтесь с методом Symbol#to_proc
здесь. Здесь :name
принудительно передается в proc.
Кстати, здесь это часто встречается - просто очень трудно найти в гугле или ином поиске "двоеточие с амперсандом" :).