这个问题受this one的启发。当传递到`instance_exec`时如何执行proc
Proc::new
有一个选项,而不在一个方法中的块被称为:
Proc::new
可以在没有一个块只在具有附接的块的方法被调用,在这种情况下该块被转换为Proc
目的。
当proc
/lambda
实例作为代码块传递,正在创建的Proc
新实例:
Proc.singleton_class.prepend(Module.new do
def new(*args, &cb)
puts "PROC#{[block_given?, cb, *args].inspect}"
super
end
end)
Proc.prepend(Module.new do
def initialize(*args, &cb)
puts "INIT #{[block_given?, cb, *args].inspect}"
super
end
def call(*args, &cb)
puts "CALL #{[block_given?, cb, *args].inspect}"
super
end
end)
λ = ->(*args) { }
[1].each &λ
#⇒ [1]
正如人们所看到的,无论是呼叫Proc::new
发生的事情,也没有Proc#initialize
和/或Proc#call
被调用。
现在的问题是:ruby是如何在引擎盖下创建并执行块封装的?
NB不要在pry
/irb
控制台测试上面的代码:他们知道有毛刺用这种纯粹的执行,主要是因为它们的补丁特效。
版本的Ruby? – fl00r
@ fl00r MRI 2.1-2.3,我真的相信所有版本在这里都是一样的。 – mudasobwa
我不能接收你的输出'ruby 2.2.2p95(2015-04-13 revision 50295)[x86_64-darwin14]'我得到了'[1]。每个&λ; => [1]' – fl00r