我想知道是否可以将块传递给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?
Procs不能接受块作为隐式参数(您正在尝试的格式).proc 可以显式接收其他proc对象作为参数,也可以使用&arguments接收.例:
a = Proc.new do |&block|
block.call
end
a.call() {puts "hi"}
Run Code Online (Sandbox Code Playgroud)
yield 是一种语言水平的魔法,只适用于方法的上下文.
| 归档时间: |
|
| 查看次数: |
814 次 |
| 最近记录: |