Pytanie jest inspirowane przez this one.Sposób wykonywania procesu po przekazaniu go do instancji `instance_exec`
Proc::new
ma możliwość być wywołany bez bloku wewnątrz sposób:
Proc::new
może być wywołany bez bloku tylko w sposobie z przyłączonym bloku, przy czym bloki te przeprowadza się wProc
obiekt.
Gdy instancja proc
/lambda
jest przekazywana jako blok kodu, nowa instancja Proc
powstaje:
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]
Jak można zobaczyć, ani wezwanie do Proc::new
stało, ani Proc#initialize
i/lub Proc#call
zostały wywołane.
Pytanie brzmi: jak Ruby tworzy i wykonuje owijkę bloku pod maską?
NB Nie przetestować powyższy kod w pry
/irb
konsoli: oni mają znane usterki z czystego wykonania tego, w zasadzie dlatego, że procs krosowe.
wersja Ruby? – fl00r
@ fl00r MRI 2.1-2.3, rzeczywiście uważam, że wszystkie wersje działają tutaj tak samo. – mudasobwa
Nie mogę otrzymać twojego wyjścia 'ruby 2.2.2p95 (2015-04-13 rewizja 50295) [x86_64-darwin14]' Mam '[1] .eak &λ; => [1]' – fl00r