Ruby Language
Обезьяна патч в рубине
Поиск…
Вступление
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