Möglich ein curied proc zu instance_eval?

8

Angenommen, ich habe eine Klasse wie diese:

%Vor%

Und ein proc, der auf eine Mitgliedsfunktion von Test verweist:

%Vor%

Um p aufzurufen, binde ich es an eine Instanz von Test :

%Vor%

Angenommen, ich möchte nur y an p übergeben und immer x = 1 :

übergeben %Vor%

Idealerweise sollte ich nur instance_exec wie zuvor verwenden können, aber stattdessen:

%Vor%

Der Prozess läuft in einer scheinbar fehlerhaften Bindung. Was gibt?

    
John Ledbetter 02.07.2014, 14:26
quelle

1 Antwort

3

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 .

%Vor%

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:

%Vor%

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!)

    
simonwo 03.07.2014, 12:51
quelle

Tags und Links