Ruby Language
Singe en Ruby
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