代码之家  ›  专栏  ›  技术社区  ›  Brian Armstrong

块语法差异导致“LocalJumpError:未给定块(yield)”[重复]

  •  17
  • Brian Armstrong  · 技术社区  · 12 年前

    看到一个奇怪的案件出现,试图弄清楚这里发生了什么:

    > def test
    >   p yield
    > end
    => nil
    > test { 1 }
    1
    => 1
    > p test { 1 }
    1
    1
    => 1
    > p test do
    >   1
    > end
    LocalJumpError: no block given (yield)
    
    2 回复  |  直到 12 年前
        1
  •  22
  •   Alex Wayne    6 年前

    解析器识别出这一点

    p test do
      1
    end
    

    就像这样

    p(test) do
      1
    end
    

    块被传递到 p test 因此 yield 不能屈服,并导致错误。

        2
  •  17
  •   Sergio Tulentsev    8 年前

    do {} 表示附加到方法的块不是完全可互换的。

    p test do
      1
    end
    

    先例正在折磨你。实际上是这样的:

    p(test()) do
      1
    end
    

    所以这个街区被传给了 p test .

    {} 优先级高于 ,因此与语法上更紧密的方法结合在一起。对于其他具有符号等价物的ruby关键字也是如此,例如 and / && or / || ,这就是为什么通常建议使用符号而不是单词的原因。

    推荐文章