ventajas recorrer que patron linkedlist iteradores iterador implementar desventajas ruby methods proc

ruby - que - recorrer arraylist java foreach



qué pasó cuando se pasa un método al método iterador (1)

Como sabemos, wo puede pasar un método a un método de iterador por un prefijo &:
Por ejemplo:

["a", "b"].map(&:upcase) #=> ["A", "B"] def rettwo 2 end ["a", "b"].map(&:rettwo) #=> [2, 2]

Aquí está el problema, cuando escribo un método, paso un método con &: prefijo a él, recibo un mensaje de error: "ArgumentError: no receiver given".
Déjame mostrar el código:

def a_simple_method &proc puts proc.class # it shows `Proc` proc.call end def a_iterator_method puts yield end a_simple_method &:rettwo #=> ArgumentError: no receiver given a_iterator_method &:rettwo #=> ArgumentError: no receiver given

¿Qué es lo que me falta? ¿Cómo lo maneja el map como método de Array?


Esto es lo que funciona. Explicación a continuación.

class String def rettwo self + self end end def a_simple_method &proc proc.call(''a'') end def a_iterator_method yield ''b'' end a_simple_method(&:rettwo) # => "aa" a_iterator_method(&:rettwo) # => "bb"

La construcción &: se llama Symbol#to_proc . Convierte el símbolo en un proceso. Este proceso espera un receptor como primer argumento. Los argumentos restantes se utilizan para llamar al proceso. No está pasando ningún argumento, de ahí el error "receptor no dado".

Aquí hay una demostración de argumentos adicionales:

class String def say name "#{self} #{name}" end end def a_simple_method &proc proc.call(''hello'', ''ruby'') end a_simple_method(&:say) # => "hello ruby"

Aquí hay una definición de Symbol # to_proc de alguna publicación de blog de 2008. Modern Symbol # to_proc parece implementarse en C, pero esto aún puede ayudar a comprenderlo.

class Symbol def to_proc Proc.new { |*args| args.shift.__send__(self, *args) } end end