Поиск…


Вступление

Monkey Patching - способ изменения и расширения классов в Ruby. В принципе, вы можете изменять уже определенные классы в Ruby, добавляя новые методы и даже модифицируя ранее определенные методы.

замечания

Патч обезьяны часто используется для изменения поведения существующего кода ruby, например, из драгоценных камней.

Например, см. Этот смысл .

Это также можно использовать для расширения существующих классов Ruby, таких как Rails, с ActiveSupport, вот пример этого .

Изменение любого метода

def hello
  puts "Hello readers"
end

hello # => "Hello readers"

def hello
  puts "Hell riders"
end

hello # => "Hell riders"

Изменение существующего рубинового метода

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

class String
  def reverse
    "Hell riders"
  end
end

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

Изменение метода с параметрами

Вы можете получить доступ к тому же контексту, что и метод, который вы переопределите.

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

Расширение существующего класса

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

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

Безопасное исправление обезьян с уточнениями

Начиная с Ruby 2.0, Ruby позволяет более безопасно очищать Monkey с уточнениями. В основном это позволяет ограничить код Monkey Patched, который применяется только тогда, когда он запрашивается.

Сначала мы создаем уточнение в модуле:

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

Затем мы можем решить, где его использовать:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow