我可以将块传递给Proc吗?

Hub*_*bro 7 ruby

我想知道是否可以将块传递给Proc.只是传递一个块Proc.call不起作用:

foo = Proc.new {
  yield
}

foo.call {
  puts "test"
}
Run Code Online (Sandbox Code Playgroud)

结果是:

LocalJumpError:没有给出块(yield)

lambdas也是如此.然而,这确实与方法对象的工作:

class Foo
  def bar
    yield
  end
end

bar = Foo.new.method :bar

bar.call { puts "Success!" }
Run Code Online (Sandbox Code Playgroud)

结果是:

成功!

奇怪的是,在将方法对象转换为proc之后它仍然有效:

bar.to_proc.call { puts "Success!" }
Run Code Online (Sandbox Code Playgroud)

结果是:

成功!

那么为什么从一个块生成的Proc不接受块,但原来是一个方法的Proc呢?是否可以从接受块的块创建Proc?

Lin*_*ios 7

Procs不能接受块作为隐式参数(您正在尝试的格式).proc 可以显式接收其他proc对象作为参数,也可以使用&arguments接收.例:

a = Proc.new do |&block|
  block.call
end

a.call() {puts "hi"}
Run Code Online (Sandbox Code Playgroud)

yield 是一种语言水平的魔法,只适用于方法的上下文.

  • 你的意思是*blocks*不能接受其他块作为隐式参数吗?因为正如我在我的问题中所证明的那样,procs*can*如果它们从方法转换为procs. (2认同)