web-dev-qa-db-fra.com

Retour inattendu (LocalJumpError)

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.

40
Eli Rose

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.

44
sarahhodne