Szukaj…


Wprowadzenie

Monkey Patching to sposób modyfikowania i rozszerzania klas w Ruby. Zasadniczo możesz modyfikować już zdefiniowane klasy w Rubim, dodając nowe metody, a nawet modyfikując wcześniej zdefiniowane metody.

Uwagi

Łata małp jest często używana do zmiany zachowania istniejącego kodu ruby, na przykład klejnotów.

Na przykład zobacz tę treść .

Można go również wykorzystać do rozszerzenia istniejących klas ruby, podobnie jak Railsy z ActiveSupport, oto przykład tego .

Zmiana dowolnej metody

def hello
  puts "Hello readers"
end

hello # => "Hello readers"

def hello
  puts "Hell riders"
end

hello # => "Hell riders"

Zmiana istniejącej metody ruby

puts "Hello readers".reverse # => "sredaer olleH"

class String
  def reverse
    "Hell riders"
  end
end

puts "Hello readers".reverse # => "Hell riders"

Zmiana metody za pomocą parametrów

Możesz uzyskać dostęp do tego samego kontekstu co metoda, którą zastępujesz.

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 ⛵"

Rozszerzanie istniejącej klasy

class String
  def fancy
    "~~~{#{self}}~~~"
  end
end

puts "Dorian".fancy # => "~~~{Dorian}~~~"

Bezpieczne łatanie małp z udoskonaleniami

Od Ruby 2.0 Ruby pozwala na bezpieczniejsze łatanie małp z udoskonaleniami. Zasadniczo pozwala to ograniczyć kod Monkey Patched do stosowania tylko wtedy, gdy jest wymagany.

Najpierw tworzymy udoskonalenie w module:

module RefiningString
  refine String do
    def reverse
      "Hell riders"
    end
  end
end

Następnie możemy zdecydować, gdzie go użyć:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow