【问题标题】:How to yield from a Ruby block?如何从 Ruby 块中获取收益?
【发布时间】:2016-07-30 04:45:33
【问题描述】:

我有一个需要一个块的函数。这个块也需要一个块:

def fn
  yield do n
    puts n
  end
end

fn do
  yield 1
end

此代码应打印“1”。然而,它实际上做的是失败:

语法错误,意外的keyword_do

我可以让函数取一个 proc:

def fn(&block)
  block.() do n
    puts n
  end
end

但是在这种情况下,代码在 yield 行失败:

没有给出块(yield)(LocalJumpError)

我不想让内部块成为 proc:

fn do |&block|
  block.(1)
end

因为它看起来很糟糕。我宁愿让步,至少在内部块中。我该如何解决这个问题?

【问题讨论】:

  • Lambdas 和 procs 看起来并不可怕。这种名声是不应该的。
  • 我不会称之为污染。这不是你的问题。您通过在本网站上发布放弃了所有权利,它会自动成为知识共享。您不能声明所有权。

标签: ruby block yield


【解决方案1】:

你使用 procs 的问题在于你使用了丑陋的语法。这就是为什么它们看起来很糟糕。 .call 的使用更为常见:

def fn(&block)
  block.call do |n|
    puts n
  end
end

fn do |&block|
  block.call(1)
end

至于你两次尝试失败的原因,依次为:

  1. yield 是关键字,而不是方法调用。这就是你没有通过它的原因。
  2. yield 屈服于当前块。但是在这种情况下没有块:fn 调用不在传递块的方法调用中。它作为顶级表达式执行。

总结一下:使用 procs。放弃使用yield 这样做的希望。

【讨论】:

    【解决方案2】:

    你不能单独从一个块中屈服。 yield 关键字总是在方法的范围内起作用。请参阅documentation for method definitionsdocumentation for Ruby keywords

    产量

    开始执行发送到当前方法的块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-21
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 2020-02-26
      相关资源
      最近更新 更多