La sentencia break para los bloques (según The Ruby Programming Language) se define de la siguiente manera:¿Por qué la declaración de interrupción en ruby se comporta de manera diferente cuando se utiliza Proc.new v. El signo de ampersand?
que hace que el bloque de volver a su repetidor y el repetidor para volver al método que se invoca.
Por lo tanto, cuando se ejecuta el siguiente código, se produce un LocalJumpError.
def test
puts "entering test method"
proc = Proc.new { puts "entering proc"; break }
proc.call # LocalJumpError: iterator has already returned
puts "exiting test method"
end
test
Mientras que el código siguientes no hace lanzar una LocalJumpError. ¿Qué tiene de especial el signo de ampersand? ¿El signo ampersand no usa implícitamente Proc.new?
def iterator(&proc)
puts "entering iterator"
proc.call # invoke the proc
puts "exiting iterator" # Never executed if the proc breaks
end
def test
iterator { puts "entering proc"; break }
end
test
En otras palabras, leo el signo de ampersand como un medio de alinear la llamada Proc.new. En ese punto, el comportamiento debería ser el mismo que el primer fragmento de código.
def iterator (p = Proc.new { puts "entering proc"; break})
...
end
Negación: estoy Novato aprendizaje de la lengua (rubí 1.9.2), y por lo tanto a apreciar las referencias y una sinopsis detallada.
No hay tiempo para una respuesta correcta, pero se trata de alcance, no tanto un Proc o Lambda son especiales. – coreyward
cuando tenga tiempo ... por favor visite esta pregunta nuevamente. Agradecería su visión –
En lugar de 'Proc.new' intente' lambda'. – Casper