【问题标题】:Unexpected Return (LocalJumpError)意外返回 (LocalJumpError)
【发布时间】:2013-07-23 02:42:30
【问题描述】:

这段 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

错误在block (2 levels) in &lt;main&gt;': unexpected return (LocalJumpError)。我想创建一个包含 n 个(以及其余的零)的平面列表,其中 n 是分母低于 8 且介于 1/3 和 1 之间的有理数的数量/2。 (it's a Project Euler problem)。所以我试图从内部块返回。

【问题讨论】:

  • 不要在块中使用return。只需删除两个return,您的代码就可以了。

标签: ruby ruby-2.0


【解决方案1】:

您不能在 Ruby* 的块内return。最后一条语句成为返回值,因此您可以在您的情况下删除 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

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

【讨论】:

  • 可以在 Ruby 的块内使用return。它将从封闭方法返回。在这种情况下,没有没有封闭方法,这就是为什么会出错,它没有因为块中的return是非法的。
  • @JörgWMittag 你说得对,我在简化。 return 返回最近的方法 lambda 块你在里面。如果您不在其中,您将收到LocalJumpError
  • @OK999: def foo; yield end; def bar; foo { return } end; bar
  • @JörgWMittag 使用的短语“它将从封闭方法返回”容易引起误解。它从创建块的方法返回,而不是像许多人认为的那样,从调用块的方法返回。
  • @JörgWMittag 同意,但很多开发者认为,如果在执行foo(a_proc)a_proc 的过程中返回,这将导致foo 返回。当然不会,它会导致包含a_proccreation 的方法(或lambda 主体)返回。也许你不同意这是一个常见的误解?我已经看过几个博客和 SO 答案。
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2020-12-08
  • 2018-03-24
  • 1970-01-01
  • 2020-06-24
  • 2020-12-07
相关资源
最近更新 更多