Ruby Language
Monkey Patching in Ruby
Ricerca…
introduzione
Monkey Patching è un modo per modificare ed estendere le classi in Ruby. In sostanza, è possibile modificare le classi già definite in Ruby, aggiungendo nuovi metodi e persino modificando i metodi precedentemente definiti.
Osservazioni
La patch delle scimmie viene spesso utilizzata per modificare il comportamento del codice rubino esistente, ad esempio dalle gemme.
Per esempio, vedi questo succo .
Può anche essere usato per estendere classi ruby esistenti come Rails fa con ActiveSupport, eccone un esempio .
Cambiare qualsiasi metodo
def hello
puts "Hello readers"
end
hello # => "Hello readers"
def hello
puts "Hell riders"
end
hello # => "Hell riders"
Modifica di un metodo esistente in ruby
puts "Hello readers".reverse # => "sredaer olleH"
class String
def reverse
"Hell riders"
end
end
puts "Hello readers".reverse # => "Hell riders"
Modifica di un metodo con parametri
È possibile accedere allo stesso contesto esatto del metodo che si sovrascrive.
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 ⛵"
Estendere una classe esistente
class String
def fancy
"~~~{#{self}}~~~"
end
end
puts "Dorian".fancy # => "~~~{Dorian}~~~"
Scimmia sicura che si aggiusta con i perfezionamenti
Dal momento che Ruby 2.0, Ruby consente di avere Patch Patching più sicuro con perfezionamenti. Fondamentalmente consente di limitare il codice Monkey Patched per applicare solo quando richiesto.
Per prima cosa creiamo un perfezionamento in un modulo:
module RefiningString
refine String do
def reverse
"Hell riders"
end
end
end
Quindi possiamo decidere dove 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow