为啥我不能在 Ruby 中将块传递给 proc?

Posted

技术标签:

【中文标题】为啥我不能在 Ruby 中将块传递给 proc?【英文标题】:Why can't I pass a block to the proc in Ruby?为什么我不能在 Ruby 中将块传递给 proc? 【发布时间】:2013-06-25 12:55:37 【问题描述】:

为什么我不能这样做:

do_once = Proc.new 产量 do_once.call puts 1

irb 抛出 LocalJumpError: no block given (yield)

【问题讨论】:

【参考方案1】:

yield 适用于传递给包装方法上下文的块。在你的情况下,我认为它是 irb 所依赖的任何方法(lib/ruby/2.0.0/irb/workspace.rb:86 evaluate,如果 caller 可以通过)。

如果你将它包装在一个函数中,它会起作用,因为你改变了方法上下文:

def do_stuff
  do_once = Proc.new  yield 
  do_once.call 
end

do_stuff  puts 1 

注意上面没有do_once.call 的块:yield 适用于传递给do_stuff 的块,而不是传递给do_once 的块。

或者,显式声明块以避免完全使用yield:

do_once = Proc.new  |&block| block.call 
do_once.call  puts 1 

【讨论】:

【参考方案2】:

你可以这样做:

do_once = Proc.new  |&block| block.call 
do_once.call  puts 1 

【讨论】:

以上是关于为啥我不能在 Ruby 中将块传递给 proc?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 视图中将 Ruby 变量传递给 JavaScript 函数?

为啥我应该使用 lambda/proc ?解释它的重要性 [重复]

UNIX为啥要把PCB分为进程表项proc区和U区

为啥我不能在通知中将数组转换为 AnyObject?

如何在Rails视图中将Ruby变量传递给JavaScript函数?

将块传递给方法传递给Ruby中的另一个方法