Ruby Language
Affe Patching in Rubin
Suche…
Einführung
Monkey Patching ist eine Methode zum Ändern und Erweitern von Klassen in Ruby. Grundsätzlich können Sie bereits definierte Klassen in Ruby ändern, neue Methoden hinzufügen und sogar zuvor definierte Methoden ändern.
Bemerkungen
Affen-Patching wird häufig verwendet, um das Verhalten von vorhandenem Ruby-Code zu ändern, z. B. von Edelsteinen.
Siehe zum Beispiel diesen Kern .
Es kann auch verwendet werden, um vorhandene Ruby-Klassen zu erweitern, wie dies Rails mit ActiveSupport tut. Hier ein Beispiel .
Eine beliebige Methode ändern
def hello
puts "Hello readers"
end
hello # => "Hello readers"
def hello
puts "Hell riders"
end
hello # => "Hell riders"
Ändern einer vorhandenen Ruby-Methode
puts "Hello readers".reverse # => "sredaer olleH"
class String
def reverse
"Hell riders"
end
end
puts "Hello readers".reverse # => "Hell riders"
Methode mit Parametern ändern
Sie können auf den gleichen Kontext zugreifen wie die Methode, die Sie überschreiben.
class Boat
def initialize(name)
@name = name
end
def name
@name
end
end
puts Boat.new("Doat").name # => "Doat"
class Boat
def name
"⛵ #{@name} ⛵"
end
end
puts Boat.new("Moat").name # => "⛵ Moat ⛵"
Vorhandene Klasse erweitern
class String
def fancy
"~~~{#{self}}~~~"
end
end
puts "Dorian".fancy # => "~~~{Dorian}~~~"
Sicheres Affen-Patchen mit Verfeinerungen
Seit Ruby 2.0 erlaubt Ruby sichereres Monkey Patching mit Verfeinerungen. Grundsätzlich ist es möglich, den Code für den Affen-Patch so einzuschränken, dass er nur auf Anforderung angewendet wird.
Zuerst erstellen wir eine Verfeinerung in einem Modul:
module RefiningString
refine String do
def reverse
"Hell riders"
end
end
end
Dann können wir entscheiden, wo wir es verwenden sollen:
class AClassWithoutMP
def initialize(str)
@str = str
end
def reverse
@str.reverse
end
end
class AClassWithMP
using RefiningString
def initialize(str)
@str = str
end
def reverse
str.reverse
end
end
AClassWithoutMP.new("hello".reverse # => "olle"
AClassWithMP.new("hello").reverse # "Hell riders"
Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow