Wenn ich eine Übereinstimmung mit einem regulären Ausdruck mit zehn Captures mache:
%Vor% dann, für , bekomme ich:
aber es fehlt in global_variables
. Ich bekomme (in einer Sitzung):
Hier sind nur die ersten neun aufgeführt:
%Vor%Dies wird auch bestätigt durch:
%Vor% Wo ist gespeichert und warum wird es nicht in
global_variables
gespeichert?
Die nummerierten Variablen, die von Kernel#global_variables
zurückgegeben werden, sind immer dieselben, noch bevor sie zugewiesen wurden. I.e. through
wird zurückgegeben, noch bevor Sie die Übereinstimmung herstellen, und die Übereinstimmung von mehr wird nicht zur Liste hinzugefügt. (Sie können auch nicht zugewiesen werden, z. B. mit
= "foo"
.)
Betrachten Sie den Quellcode für die Methode:
%Vor% Sie können (nachdem Sie sich an C gewöhnt haben) aus der for-Schleife sehen, dass die Symbole bis
fest im Rückgabewert der Methode codiert sind.
Wie können Sie dann noch verwenden, wenn sich die Ausgabe von
global_variables
nicht ändert? Nun, die Ausgabe könnte ein wenig irreführend sein, da es nahe legt, dass Ihre Matchdaten in separaten Variablen gespeichert sind, aber dies sind nur Verknüpfungen, die an das in MatchData
gespeicherte $~
-Objekt delegieren.
Im Wesentlichen $n
sieht auf $~[n]
. Dieses MatchData
-Objekt (stammt aus der globalen Tabelle) ist Teil der ursprünglichen Ausgabe der Methode, wird jedoch erst zugewiesen, wenn Sie eine Übereinstimmung gefunden haben.
Was die Rechtfertigung für die Einbeziehung von bis
in die Ausgabe der Funktion betrifft, müssten Sie jemanden im Ruby-Kernteam fragen. Es mag willkürlich erscheinen, aber es gibt wahrscheinlich einige Überlegungen, die in die Entscheidung einfließen.
Ruby scheint ,
usw. auf Parser-Ebene zu behandeln:
Ausgabe:
%Vor% BTW, die maximale Anzahl von Erfassungsgruppen beträgt 32.767 und Sie können auf alle via $n
:
Wir betrachten dieses Verhalten als Fehler. Wir haben das im Kofferraum behoben.
Tags und Links ruby regex pseudo-globals