Angenommen, ich habe eine Klasse wie diese:
%Vor% Und ein proc, der auf eine Mitgliedsfunktion von Test
verweist:
Um p
aufzurufen, binde ich es an eine Instanz von Test
:
Angenommen, ich möchte nur y
an p
übergeben und immer x = 1
:
Idealerweise sollte ich nur instance_exec
wie zuvor verwenden können, aber stattdessen:
Der Prozess läuft in einer scheinbar fehlerhaften Bindung. Was gibt?
Ja, ich glaube, das ist ein Fehler.
Ich denke, es kommt darauf an, dass curry
einen "C level proc" anstatt eines normalen proc zurückgibt. Ich verstehe den Unterschied zwischen den beiden nicht vollständig (ich denke, der erste ist einer, der durch den Ruby-C-Code erstellt wurde, was curry
tut), aber Sie können sehen, dass sie anders sind, wenn Sie versuchen, eine Bindung aufzunehmen .
Wenn Sie die Quelle betrachten, sieht das so aus, als hätten ihre internen Strukturdarstellungen unterschiedliche Werte das iseq
-Member, das angibt, welche Art von Befehlsfolge dieser Block enthält.
Dies ist signifikant, wenn Sie instance_exec
aufrufen, was schließlich dazu führt, dass invoke_block_from_c
in aufgerufen wird vm.c , die abhängig vom iseq
-Typ verzweigt:
Der Zweig, den ich verpasst habe ( ...
) ruft am Ende vm_push_frame
mit einer Umgebung auf, die wie eine vm_yield_with_cfunc
aussieht.
Meine Vermutung wäre also, dass der curried proc im C-Code erstellt wird und einen anderen "Typ" als Ihr erster proc erhält, der andere Zweig wird im obigen Snippet genommen und die Umgebung wird nicht verwendet.
Ich sollte darauf hinweisen, dass all das ziemlich spekulativ ist, basierend auf dem Lesen des Codes, ich habe keine Tests ausgeführt oder irgendetwas ausprobiert (und ich bin auch nicht alles , das mit intern vertraut ist Ruby sowieso!)