Zoeken…


Invoering

Monkey Patching is een manier om klassen in Ruby te wijzigen en uit te breiden. Kortom, u kunt reeds gedefinieerde klassen in Ruby wijzigen, nieuwe methoden toevoegen en zelfs eerder gedefinieerde methoden wijzigen.

Opmerkingen

Monkey-patching wordt vaak gebruikt om het gedrag van bestaande ruby-code te veranderen, bijvoorbeeld van edelstenen.

Zie bijvoorbeeld deze kern .

Het kan ook worden gebruikt om bestaande ruby-klassen uit te breiden, zoals Rails met ActiveSupport, hier is een voorbeeld van .

Een methode wijzigen

def hello
  puts "Hello readers"
end

hello # => "Hello readers"

def hello
  puts "Hell riders"
end

hello # => "Hell riders"

Een bestaande ruby-methode wijzigen

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

class String
  def reverse
    "Hell riders"
  end
end

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

Een methode met parameters wijzigen

U hebt toegang tot exact dezelfde context als de methode die u overschrijft.

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

Een bestaande klasse uitbreiden

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

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

Veilige Monkey-patching met verfijningen

Sinds Ruby 2.0 biedt Ruby veiligere Monkey Patching met verfijningen. In feite staat het toe om de Monkey Patched-code te beperken om alleen van toepassing te zijn wanneer deze wordt gevraagd.

Eerst maken we een verfijning in een module:

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

Dan kunnen we beslissen waar het te gebruiken:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow