Что действительно отображается (&:name) делают в этом коде Ruby?

Пытаясь понять 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) работа? Я вижу, что события являются массивом, и таким образом он вызывает свой метод карты. Теперь мой вопрос, где блок, это передается созданной карте? Что является символом: имя в этом контексте? Я пытаюсь понять, как это работает.

10
задан Andrew Grimm 11 April 2011 в 12:34
поделиться

1 ответ

events.map(&:name)

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

events.map{|x| x.name}

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

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

Кстати, здесь это часто встречается - просто очень трудно найти в гугле или ином поиске "двоеточие с амперсандом" :).

21
ответ дан 3 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: