如何从Ruby块中产生?

时间:2016-04-08 19:25:44

标签: ruby block yield

我有一个带块的功能。这个块也需要一个块:

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

因为它看起来很糟糕。相反,我宁愿屈服,至少在内部区块。我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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调用不在传递块的方法调用中。它作为顶级表达式执行。
  3. 总结:使用过程。放弃希望用yield

    这样做

答案 1 :(得分:0)

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

  

收益

     

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