tutorial - ruby wikipedia
Atajo de colon de rubĂ y signo (2)
No hay nada especial en la combinación del símbolo y el símbolo. Aquí hay un ejemplo que (ab) usa la expresión regular:
class Regexp
def to_proc
->(str) { self =~ str ; $1 }
end
end
%w(station nation information).map &/(.*)ion/
=> ["stat", "nat", "informat"]
O enteros.
class Integer
def to_proc
->(arr) { arr[self] }
end
end
arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]
¿Quién necesita arr.map(&:fifth)
cuando tiene arr.map &4
?
Posible duplicado:
¿Qué significa mapa (&: nombre) en Ruby?
En Ruby, sé que si lo hago:
some_objects.each(&:foo)
Es lo mismo que
some_objects.each { |obj| obj.foo }
Es decir, &:foo
crea el bloque { |obj| obj.foo }
{ |obj| obj.foo }
, lo convierte en un Proc, y lo pasa a cada uno. ¿Por qué funciona esto? ¿Es solo un caso especial de Ruby, o hay alguna razón por la que esto funciona como lo hace?
Su pregunta es incorrecta, por así decirlo. Lo que está sucediendo aquí no es "ampersand and colon", es "ampersand and object". Los dos puntos en este caso son para el símbolo. Entonces, hay &
y hay :foo
.
El &
llama to_proc
en el objeto, y lo pasa como un bloque al método. En Rails, to_proc
se implementa en Symbol
, de modo que estas dos llamadas son equivalentes:
something {|i| i.foo }
something(&:foo)
Además, to_proc
en Symbol
se implementa en Ruby 1.8.7 y 1.9, por lo que de hecho es una "cosa de rubí".
Entonces, para resumir: &
llama to_proc
en el objeto y lo pasa como un bloque al método, y Ruby implementa to_proc
en Symbol
.