2012-02-08 11 views
7

Duplicar posible:
What does map(&:name) mean in Ruby?
Ruby/Ruby on Rails ampersand colon shortcut¿Qué significa &: en rubí, es un bloque mezclado con un símbolo?

Por ejemplo,

contacts.sort_by(&:first_name). 

entiendo lo que hace esto, pero yo no entiendo las &: anotaciones, lo que hace eso significa, es un símbolo (:) con un bloque (&)? ¿Dónde puedo leer más al respecto?

+2

Este es un duplicado de no menos de otros 16 preguntas que ya han sido formuladas y contestadas aquí en StackOverflow:. [Comprensión \ [ClassOne, ClassTwo \] cada \ (y : my_method \)] (http://StackOverflow.Com/q/99318/), [¿Qué significa 'map (&: name)' en Ruby?] (http://StackOverflow.Com/q/1217088/) , [¿Qué es exactamente '&: capitalize' en Ruby?] (Http://StackOverflow.Com/q/1792683/), [Ruby/Ruby on Rails y el acceso directo de dos puntos] (http://StackOverflow.Com/q/ 1961030 /), [Ruby: '&: symbol' syntax] (http://StackOverflow.Com/q/2096975/), ... –

+2

... [¿Qué es esto' &: last' Ruby Construct Called?] (Http://StackOverflow.Com/q/2211751/), [¿Cómo se llama el '&:' operador en Ruby?] (http://StackOverflow.Com/q/2259775/), [¿Qué hace 'map (&: name)' hacer en este código de Ruby?] (http://StackOverflow.Com/q/2388337 /), [¿Qué son ': +' y '& +' en ruby?] (http://StackOverflow.Com/q/2697024/), ['&: views_count' en' Post.published. collect (&: views_count) '] (http://StackOverflow.Com/q/3888044/), [Ruby Proc Syntax] (http://StackOverflow.Com/q/4512587/), [¿Cómo funciona" '(1 ..4) .inject (&: +) '" trabajo en Ruby] (http://StackOverflow.Com/q/5003257/), ... –

+2

... [¿Qué significa la siguiente declaración '&: property'?] (Http: //StackOverflow.Com/q/5620411/), [¿Qué significa '&' en la siguiente sintaxis de ruby?] (Http://StackOverflow.Com/q/5952175/), [¿Por qué uno usaría el operador unario? en una propiedad en ruby? es decir '&: first'] (http: // StackOverflow.Com/q/6289084 /), y [¿cómo 'Array # map' tiene un parámetro para hacer algo como esto?] (Http://StackOverflow.Com/q/6716629/). –

Respuesta

8

Cuando & se usa antes del objeto Proc en la invocación del método, trata el Proc como si fuera un bloque ordinario después de la invocación.
Cuando & se usa antes que otro tipo de objeto (símbolo :first_name en su caso) en la invocación del método, intenta llamar a tocpro en este objeto y si no tiene el método to_proc obtendrá TypeError.

Generalmente &:first_name es lo mismo que &:first_name.to_proc.

Symbol#to_proc Devuelve un objeto Proc que responde al método dado por sym.

:first_name.to_proc volverá Proc que se ve así:

proc { |obj, *args, &block| obj.first_name(*args, &block) } 

este método Proc invoca especificado por símbolo original en el objeto pasa como primer parámetro y pasar todos los parámetros de descanso + bloque ya que este método argumentos .

Un ejemplo más:

> p = :each.to_proc 
=> #<Proc:0x00000001bc28b0> 
> p.call([1,2,3]) { |item| puts item+1 } 
2 
3 
4 
=> [1, 2, 3] 
3

Es mismo con contacts.sort_by {|o| o.first_name}

Devuelve un objeto Proc que responde al método dado por sym.

+1

Downvoted para desalentar las respuestas a preguntas comúnmente duplicadas. – Phrogz

+0

@Phrogz ¿Debo buscar primero cuando responda una pregunta? – xdazz

+0

En mi opinión, sí. Lo siento. Esta pregunta debe cerrarse y eliminarse en beneficio de Stack Overflow. Es más difícil eliminar una pregunta cuando tiene respuestas. – Phrogz

Cuestiones relacionadas