Programmatisch Alias ​​Methode, die $ & Globale Variable verwendet

8

Ich versuche, eine Methode zu aliasieren, die Rubys spezielle $& verwendet ( gibt die letzte Regex-Übereinstimmung zurück ). Ich kann das manuell tun und es funktioniert:

%Vor%

Wenn ich jedoch versuche, eine Methode zu schreiben, die das für mich tut, schlägt es fehl:

%Vor%

Es sieht so aus, als ob der globale Status vom Umfang der programatic_alias Methode beeinflusst wird, aber ich bin mir nicht sicher, ob das so ist. Die Fragen lauten wie folgt: Wie kann ich String#sub programmatisch aliasieren, so dass es immer noch mit Rubys speziellen globalen Variablen funktioniert?

    
Schneems 28.05.2015, 17:09
quelle

1 Antwort

4

Soweit ich weiß, können Sie das nicht tun. Die Dokumente sagen

  

Diese globalen Variablen sind Thread-lokale und Methoden-lokale Variablen.

Wenn Sie sich die Ruby-Quelle ansehen, rufen Sie $& auf last_match_getter die ihre Daten von rb_backref_get bezieht, die vm_svar_get (das Überspringen einiger interner Methoden) ruft den aktuellen Kontrollrahmen ab und liest die Daten von dort . Keine dieser Daten ist der Ruby-API ausgesetzt - es gibt keine Möglichkeit, diese Daten von einem Frame zu demjenigen zu übertragen, auf den Sie zugreifen möchten.

In Ihrem zweiten Beispiel findet der Aufruf der ursprünglichen Methode innerhalb Ihrer programatic_alias -Methode statt, und daher wird $& in diesem Bereich festgelegt. Aus dem gleichen Grund

%Vor%

funktioniert auch nicht.

Ihr erstes Beispiel funktioniert nur, weil die Stelle, an der sub aufgerufen wird und die Stelle, auf die $& referenziert wird (innerhalb des Blocks), im selben Methodenumfang liegen (in diesem Fall die oberste Ruby-Ebene). Ändere es zu:

%Vor%

und $& sind in Ihrem Block nicht mehr definiert (wenn Sie die Ausnahme von x abfangen, können Sie sehen, dass $& auf der obersten Ebene gesetzt ist)

    
Frederick Cheung 29.05.2015, 16:11
quelle