ruby ruby-2.0

ruby - Retorno inesperado(LocalJumpError)



ruby-2.0 (1)

¿Cuál es el problema con este código de Ruby 2.0?

p (1..8).collect{|denom| (1...denom).collect{|num| r = Rational(num, denom) if r > Rational(1, 3) and r < Rational(1, 2) return 1 else return 0 end } }.flatten

El error está en el block (2 levels) in <main>'': unexpected return (LocalJumpError) . Quiero crear una lista plana que contenga n (y el resto ceros) donde n es el número de números racionales con denominadores por debajo de 8 que están entre 1/3 y 1/2. ( es un problema de Project Euler ). Así que estoy tratando de regresar del bloque interno.


No puedes return dentro de un bloque en Ruby * . La última declaración se convierte en el valor de retorno, por lo que puede eliminar las declaraciones de devolución en su caso:

p (1..8).collect{|denom| (1...denom).collect{|num| r = Rational(num, denom) if r > Rational(1, 3) and r < Rational(1, 2) 1 else 0 end } }.flatten

* : Puedes dentro de bloques lambda : lambda { return "foo" }.call # => "foo" . Tiene que ver con el alcance y todo eso, y esta es una de las principales diferencias entre los bloques lambda y los bloques de proc . Los bloques "normales" que pasas a los métodos son más parecidos a los bloques de proc .