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