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