【问题标题】:why does ruby throw syntax error when attempting an yield within a block?为什么 ruby​​ 在块内尝试 yield 时会抛出语法错误?
【发布时间】:2020-05-14 12:20:06
【问题描述】:

我正在探索 yield 关键字及其在 ruby​​ 中的用法。虽然完全可以将一个块隐式传递给一个方法并通过 yield 调用相同的方法,但当我尝试将另一个块传递给 yielded 块时:

def test
  yield { p 'yield2' }
end

test { |&b| p 'in yield1'; b.call }

ruby 抱怨语法错误:

yield.rb:5: syntax error, unexpected '}', expecting keyword_end
  yield { p 'yield2' }
                     ^

为什么这种对待与产量的区别以及为什么这被视为语法错误?

【问题讨论】:

  • 我的 Ruby 还抱怨 unexpected '{' 紧跟在 yield 之后
  • 是的@Stefan 现在删除它

标签: ruby


【解决方案1】:

这是清理后的版本:

def test
  x = -> { p 'l1' }

  yield -> { p 'yield2' }
end

注意yield是关键字,不是方法调用,所以需要更明确一些。你不能只是在那儿打一个块然后就说它完成了,它必须是正确的lambda

然后在你的调用中,你不能打破这个块,它只是一个常规参数:

test {|b| p 'in yield1'; b.call }

现在可以了。

【讨论】:

    【解决方案2】:

    您不能将块参数传递给yield,Ruby 根本不允许这样做。

    相反,您可以使用显式块参数并将块传递给call

    def test(&block)
      block.call { p 'yield2' }
    end
    
    test { |&b| p 'in yield1'; b.call }
    # "in yield1"
    # "yield2"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多