Ruby Language
Łatka Monkey w Ruby
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