La question est inspirée de this one.Comment proc est exécuté lorsqu'il est passé à `instance_exec`
Proc::new
a la possibilité d'être appelé sans un bloc à l'intérieur d'une méthode:
Proc::new
peut être appelé sans un seul bloc dans un procédé avec un bloc fixé, dans ce cas, ce bloc est converti en leProc
objet.
Lorsque le proc
/lambda
instance est passé comme un bloc de code, la nouvelle instance de Proc
est en cours de création:
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]
Comme on peut le voir, ni l'appel à Proc::new
est arrivé, ni Proc#initialize
et/ou Proc#call
ont été appelés.
La question est: comment ruby crée et exécute une enveloppe de bloc sous le capot?
NB Ne testez pas le code ci-dessus dans la console pry
/irb
: ils connus pour avoir des glitches avec pur exécution de ce, essentiellement parce qu'ils procs patch.
version de Ruby? – fl00r
@ fl00r MRI 2.1-2.3, je crois en fait que toutes les versions agissent de la même manière ici. – mudasobwa
Je ne peux pas recevoir votre sortie 'ruby 2.2.2p95 (2015-04-13 révision 50295) [x86_64-darwin14]' J'ai eu '[1] .each &λ; => [1]' – fl00r