Quel est le problème avec ce code 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
L'erreur se trouve dans block (2 levels) in <main>': unexpected return (LocalJumpError)
. Je veux créer une liste plate contenant n ceux (et les zéros restants) où n est le nombre de nombres rationnels avec des dénominateurs inférieurs à 8 qui sont compris entre 1/3 et 1/2. ( c'est un problème Project Euler ). J'essaie donc de revenir du bloc intérieur.
Vous ne pouvez pas return
à l'intérieur d'un bloc dans Ruby*. La dernière instruction devient la valeur de retour, vous pouvez donc simplement supprimer les instructions de retour dans votre cas:
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
*: Vous pouvez à l'intérieur des blocs lambda
: lambda { return "foo" }.call # => "foo"
. Cela a à voir avec la portée et tout cela, et c'est l'une des principales différences entre les blocs lambda
et les blocs proc
. Les blocs "normaux" que vous passez aux méthodes ressemblent plus à des blocs proc
.