Ich versuche, eine Methode alias eine Methode, die Ruby spezielle $&
(returns last regex match) verwenden. Ich kann dies manuell tun und es funktioniert:
original = String.instance_method(:sub)
String.send(:define_method, :sub) do |*args, &block|
puts "called"
original.bind(self).call(*args, &block)
end
"foo".sub(/f/) { $&.upcase }
called
# => "Foo"
Allerdings, wenn ich versuche, eine Methode zu schreiben, die das für mich tut, ist es nicht:
def programatic_alias(klass, method_name)
original = klass.instance_method(method_name)
klass.send(:define_method, method_name) do |*args, &block|
puts "called"
original.bind(self).call(*args, &block)
end
end
programatic_alias(String, :sub)
"foo".sub(/f/) { $&.upcase }
called
NoMethodError: undefined method `upcase' for nil:NilClass
called
called
called
from (irb):19:in `block in irb_binding'
Es sieht aus wie der globale Zustand betroffen ist durch der Umfang der programatic_alias
Methode, aber ich bin mir nicht sicher, ob das ist, was vor sich geht. Die Fragen lauten wie folgt: Wie kann ich den Code String#sub
so programmieren, dass er immer noch mit Rubys speziellen globalen Variablen funktioniert?
Welche Version von Ruby sind verwendest du? Für mich mit 2.2.1 funktioniert dein Beispiel. –
Ich benutze Ruby 2.2.2. Sie müssen sicherstellen, dass Sie die Beispiele in verschiedenen Skripts/IRB-Sitzungen ausführen, andernfalls verwenden Sie möglicherweise den zuvor definierten Methodenaliasnamen. Ich habe auf meinem lokalen Rechner 2.2.1 versucht, das Problem zu reproduzieren. – Schneems
Warum würden Sie die globale Variable '$ &' verwenden? – hakcho