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