Ruby Language
Monkey Patching in Ruby
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