2010-03-05 10 views
10

Tratar de entender Rubí un poco mejor, me encontré con este código se navega por Internet:¿Qué hace el mapa (&: nombre) en este código de 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 

Lo que interesa particularmente es cómo lo hace events.map(&:name) trabajo? Veo que los eventos son una matriz, y por lo tanto está invocando su método de mapa. Ahora mi pregunta es, ¿dónde está el bloque que se está transfiriendo al mapa creado? ¿Cuál es el símbolo: nombre en este contexto? Estoy tratando de entender cómo funciona.

+2

Este es un duplicado exacto de * siete * preguntas diferentes. Y créame, Ruby no ha cambiado tanto en las últimas 3 semanas, por lo que probablemente las respuestas sean las mismas: http://StackOverflow.Com/questions/99318/, http://StackOverflow.Com/questions/1217088 /, http://StackOverflow.Com/questions/1792683/, http://StackOverflow.Com/questions/1961030/, http://StackOverflow.Com/questions/2096975/, http://StackOverflow.Com/questions/2211751 /, http://StackOverflow.Com/questions/2259775/. –

Respuesta

21
events.map(&:name) 

es exactamente equivalente a

events.map{|x| x.name} 

es simplemente azúcar sintáctico conveniente.

Para obtener más información, consulte el Symbol#to_proc método here. Aquí, :name está siendo forzado a un proceso.

Por cierto, esto aparece a menudo aquí - es muy difícil buscar en google o buscar "lo de los dos puntos con un símbolo" :).

+3

Tal vez, ahora que has mencionado "la cosa de los dos puntos con un símbolo", comenzará a ser recogido :) – theIV

Cuestiones relacionadas