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