【问题标题】: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)

【问题讨论】:

    标签: ruby proc


    【解决方案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 }
      

      【讨论】:

        猜你喜欢
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多