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