Ruby Language
Parches de mono en rubí
Buscar..
Introducción
Monkey Patching es una forma de modificar y extender clases en Ruby. Básicamente, puedes modificar las clases ya definidas en Ruby, agregar nuevos métodos e incluso modificar métodos previamente definidos.
Observaciones
Los parches de mono a menudo se usan para cambiar el comportamiento del código ruby existente, por ejemplo de gemas.
Por ejemplo, ver esta esencia .
También se puede usar para ampliar las clases de ruby existentes como Rails lo hace con ActiveSupport, aquí hay un ejemplo de eso .
Cambiando cualquier método
def hello
puts "Hello readers"
end
hello # => "Hello readers"
def hello
puts "Hell riders"
end
hello # => "Hell riders"
Cambiando un método de rubí existente
puts "Hello readers".reverse # => "sredaer olleH"
class String
def reverse
"Hell riders"
end
end
puts "Hello readers".reverse # => "Hell riders"
Cambiar un método con parámetros
Puede acceder al mismo contexto exacto que el método que reemplaza.
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 ⛵"
Extendiendo una clase existente
class String
def fancy
"~~~{#{self}}~~~"
end
end
puts "Dorian".fancy # => "~~~{Dorian}~~~"
Parches Safe Monkey con Refinamientos
Desde Ruby 2.0, Ruby permite tener revisiones de mono más seguras con mejoras. Básicamente, permite limitar el código de Monkey Patched para que solo se aplique cuando se solicita.
Primero creamos un refinamiento en un módulo:
module RefiningString
refine String do
def reverse
"Hell riders"
end
end
end
Entonces podemos decidir dónde usarlo:
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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow