Recherche…


Introduction

Monkey Patching est un moyen de modifier et d'étendre les classes dans Ruby. Fondamentalement, vous pouvez modifier des classes déjà définies dans Ruby, en ajoutant de nouvelles méthodes et même en modifiant des méthodes précédemment définies.

Remarques

La correction de singe est souvent utilisée pour modifier le comportement du code Ruby existant, à partir de gemmes par exemple.

Par exemple, voir cet aperçu.

Il peut également être utilisé pour étendre les classes ruby ​​existantes, comme Rails le fait avec ActiveSupport, en voici un exemple .

Changer n'importe quelle méthode

def hello
  puts "Hello readers"
end

hello # => "Hello readers"

def hello
  puts "Hell riders"
end

hello # => "Hell riders"

Modification d'une méthode Ruby existante

puts "Hello readers".reverse # => "sredaer olleH"

class String
  def reverse
    "Hell riders"
  end
end

puts "Hello readers".reverse # => "Hell riders"

Changer une méthode avec des paramètres

Vous pouvez accéder au même contexte que la méthode que vous remplacez.

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 ⛵"

Extension d'une classe existante

class String
  def fancy
    "~~~{#{self}}~~~"
  end
end

puts "Dorian".fancy # => "~~~{Dorian}~~~"

Safe Monkey Patching avec Refinements

Depuis Ruby 2.0, Ruby permet d'avoir des patchs Monkey plus sûrs avec des améliorations. Fondamentalement, il permet de limiter le code Monkey Patched à s’appliquer uniquement lorsque cela est demandé.

Nous commençons par créer un raffinement dans un module:

module RefiningString
  refine String do
    def reverse
      "Hell riders"
    end
  end
end

Ensuite, nous pouvons décider où l'utiliser:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow