Frage

Ich arbeite mit dem, was eine ziemlich basische Iteration sein sollte. Ich verstehe, dass ich es mit Rubincode erreichen könnte, aber ich arbeite bereits in einer C-Erweiterung, daher würde ich es vorziehen, diese Funktion in c mit dem Rest des Codes zu halten - vor allem da diese so arbeiten sollte (auf die eine oder andere Weise) ohne Ausgabe.

Das Problem ist mit rb_block_call. So beschreibt readme.ext rb_block_call:

generasacodicetagpre.

ruft ein Verfahren auf dem RECV mit Verfahrensname, das vom Symbol angegeben ist MID, FUNC FUNC als Block. FUNC wird den Wert vom Ertrag erhalten Als erstes Argument, Data2 als zweiter und argc / argv als dritte / vierte Argumente.

Ihr Verständnis (verifiziert durch Blick auf Rubin-Internal), ist, dass die Empfangsfunktion aussehen sollte:

generasacodicetagpre.

Und hier treffen wir unser Problem. In meinem Anwendungsfall (den ich unten inkl.), Werden RB_YIELD_VALUE und Data2 wie erwartet verabschiedet. ARGC, dagegen ist immer auf 1 eingestellt, argv [0] ist rb_yield_value, argv [1] ist falsch, argv [2] ist rb_yield_value, argv [3] wirft eine Ausnahme aus.

Es ist egal, was ich für Argc und Argv passiere; Übergeben Sie 0 und Null-Ergebnisse dasselbe wie 1 und ein Wert, der auf Qtrue eingestellt ist. Alles mit ARGC / ARGV bleibt wie beschrieben.

Hier ist der Code, mit dem ich arbeite:

generasacodicetagpre.

Rubin-Einbauten scheinen nicht viele Beispiele von rb_block_call mit argc / argv zu haben ... höchstens ein oder zwei, und ich glaube, dass sie alle die Werte intern weiter leiten, anstatt sie zu verwenden.

Gedanken?

War es hilfreich?

Lösung

Ich bin ziemlich neu für Ruby C-Erweiterung, aber ich denke, wo Ihre Verwirrung ist.

generasacodicetagpre.

argc / argv sind hier die Argumente für die Ruby-Funktion, die Sie anrufen.

in der C-Funktion als Block:

generasacodicetagpre.

argc / argv sind die Argumente des Blocks.

Ein einfaches Beispiel ist injiziert

Hier ist die C-Übersetzung von: [1,2,3] .Inject {| SUM, E |Summe + E}

generasacodicetagpre.

welche Ausgänge (eines Anrufs an rb_block_call_test):

generasacodicetagpre.

Ich glaube, dass rend_value immer argv [0]

ist

Wenn Sie Informationen zwischen dem Block und dem Anrufer übergeben möchten, verwenden Sie die Daten2

In Ihrem Beispiel nehme ich an, #Each_backtrace_Frame einen "Backtrace_Frame", und daher ist der Grund, warum ARGC / ARGV des Blocks immer 1 / the_backtrace_rame ist.Ich glaube, #each_backtrace_Frame akzeptiert eine beliebige Anzahl von Argumenten, da er keinen Fehler erhöht hat, als Sie versucht haben, einige zu bestehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top