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?

 293
Author: Community, 2009-12-25

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.

 449
Author: August Lilleaas,
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?

 78
Author: Michiel de Mare,
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