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:
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?
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
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:
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)
Tags und Links ruby global-variables metaprogramming