Warum wird nur eine begrenzte Anzahl von Captures für reguläre Ausdrücke in 'global_variables' gespeichert?

8

Wenn ich eine Übereinstimmung mit einem regulären Ausdruck mit zehn Captures mache:

%Vor%

dann, für , bekomme ich:

%Vor%

aber es fehlt in global_variables . Ich bekomme (in einer Sitzung):

%Vor%

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?

    
Sagar Pandya 09.01.2016, 09:21
quelle

3 Antworten

6

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.

    
Drenmi 09.01.2016, 10:13
quelle
9

Ruby scheint , usw. auf Parser-Ebene zu behandeln:

%Vor%

Ausgabe:

%Vor%

BTW, die maximale Anzahl von Erfassungsgruppen beträgt 32.767 und Sie können auf alle via $n :

zugreifen %Vor%     
Stefan 09.01.2016 10:48
quelle
3

Wir betrachten dieses Verhalten als Fehler. Wir haben das im Kofferraum behoben.

    
Yukihiro Matsumoto 17.01.2016 17:08
quelle

Tags und Links