Acceso directo de Ruby ampersand colon [duplicado]
Posible Duplicado:
¿Qué significa map ( & : name) en Ruby?
En Ruby, sé que si lo hago:{[11]]}
some_objects.each(&:foo)
Es lo mismo que
some_objects.each { |obj| obj.foo }
Es decir, &:foo
crea el bloque { |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?
2 answers
Su pregunta está equivocada, por así decirlo. Lo que está pasando aquí no es "ampersand and colon", es "ampersand and object". Los dos puntos en este caso son para el símbolo. Por lo tanto, hay &
y hay :foo
.
El &
llama a 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)
También, to_proc
en Symbol
se implementa en Ruby 1.8.7 y 1.9, por lo que es de hecho un " ruby cosa".
Entonces, para resumir: &
llama a to_proc
en el objeto y lo pasa como un bloque al método, y Ruby implementa to_proc
en Symbol
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 11:45:00
No hay nada especial en la combinación del ampersand 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 tienes arr.map &4
?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-09 08:17:51