意外返回(LocalJumpError)

Eli*_*ICA 40 ruby ruby-2.0

这个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
Run Code Online (Sandbox Code Playgroud)

错误在于block (2 levels) in <main>': unexpected return (LocalJumpError).我想创建一个包含n个(和其余的零)的平面列表,其中n是有理数的数,其中分母低于8,介于1/3和1/2之间.(这是项目欧拉问题).所以我试图从内部块返回.

sar*_*dne 46

你不能return在Ruby *中的一个块里面.最后一个语句成为返回值,因此您可以在您的情况下删除return语句:

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
Run Code Online (Sandbox Code Playgroud)

*:你可以在内部lambda块:lambda { return "foo" }.call # => "foo".它与范围和所有这些有关,这是lambda块和proc块之间的主要区别之一.传递给方法的"普通"块更像是proc块.

  • 你*可以在Ruby中的块内使用`return`.它将从封闭方法返回.在这种情况下,*没有*封闭方法,*是*为什么有错误,它是*不*因为块中的`return`是非法的. (78认同)
  • @OK999:`def foo; 产量结束;定义栏;foo { 返回 } 结束;酒吧` (2认同)
  • @JörgWMittag 使用的短语“它将从封闭方法返回”很容易引起误解。它从创建块的方法返回,而不是像许多人假设的那样,从调用块的方法返回。 (2认同)