【问题标题】:Can I evaluate a block inside a Proc?我可以评估 Proc 内的块吗?
【发布时间】:2013-07-22 23:50:24
【问题描述】:

我可以在 Proc 中生成一个块吗?考虑这个例子:

a = Proc.new do
  yield
end

a.call do
  puts "x"
end

我想要实现的是打印 x,但是用 ruby​​ 2.0 解释它会引发 LocalJumpError: no block given (yield)

【问题讨论】:

    标签: ruby proc yield-keyword


    【解决方案1】:

    不,你不能,因为你创建的 Proc 是一个独立的 yield - 也就是说,它是一个在其上下文中没有块的 yield。虽然您可以使用指定参数调用 procs 并将参数传递给 proc,但 yield 不能基于指定参数工作;它执行在 proc 的闭包中找到的块。并且proc的闭包是预定义的;它不会因为你稍后用块调用它而被修改。

    所以这相当于直接在irb 中输入“yield”(不在任何方法定义中),这会返回LocalJumpError: no block given (yield) 错误。

    【讨论】:

      【解决方案2】:

      @Rebitzele 解释了为什么您的代码不起作用:yield 关键字是调用已传递给方法的匿名块的简写符号,在这种情况下没有 甚至是一种方法。

      但你当然可以给块起一个名字,然后像调用任何其他可调用对象一样调用它:

      a = ->&block { block.() }
      
      a.() do puts 'x' end
      # x
      

      【讨论】:

      • 仍在试图弄清楚这里发生了什么,但这似乎对我不起作用:obj.instance_eval { def wrap(&block); a = ->&block { block.() }; a.() { puts 'goodbye' }; end}; obj.wrap { puts 'hello'; yield } 只会打印goodbye
      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2013-01-07
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 2010-09-21
      相关资源
      最近更新 更多