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
.