Ruby Language
Apaplackning i Ruby
Sök…
Introduktion
Monkey Patching är ett sätt att modifiera och utöka klasser i Ruby. I princip kan du ändra redan definierade klasser i Ruby, lägga till nya metoder och till och med ändra tidigare definierade metoder.
Anmärkningar
Apaplackning används ofta för att ändra beteendet hos befintlig rubinkod, från exempelvis ädelstenar.
Se till exempel denna vikt .
Det kan också användas för att utöka befintliga rubinklasser som Rails gör med ActiveSupport, här är ett exempel på det .
Ändra valfri metod
def hello
puts "Hello readers"
end
hello # => "Hello readers"
def hello
puts "Hell riders"
end
hello # => "Hell riders"
Ändra en befintlig rubinmetod
puts "Hello readers".reverse # => "sredaer olleH"
class String
def reverse
"Hell riders"
end
end
puts "Hello readers".reverse # => "Hell riders"
Ändra en metod med parametrar
Du kan komma åt exakt samma sammanhang som metoden du åsidosätter.
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 ⛵"
Utöka en befintlig klass
class String
def fancy
"~~~{#{self}}~~~"
end
end
puts "Dorian".fancy # => "~~~{Dorian}~~~"
Safe Monkey lappning med förfining
Sedan Ruby 2.0 tillåter Ruby att ha säkrare Monkey Patching med förfining. I grunden tillåter det att begränsa Monkey Patched-koden till att endast gälla när den begärs.
Först skapar vi en förfining i en modul:
module RefiningString
refine String do
def reverse
"Hell riders"
end
end
end
Då kan vi bestämma var vi ska använda det:
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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow