W Metaprogramming Ruby 2 w rozdziale 2 w sekcji „Udoskonalenia” znalazłem następujący fragment kodu Ruby:Ruby udoskonalenia pułapek
class MyClass
def my_method
"original my_method()"
end
def another_method
my_method
end
end
module MyClassRefinement
refine MyClass do
def my_method
"refined my_method()"
end
end
end
using MyClassRefinement
MyClass.new.my_method # => "refined my_method()"
MyClass.new.another_method # => "original my_method()" - How is this possible?
Według autora:
Jednak rozmowy do
another_method
może Cię zaskoczyć: nawet jeśli zadzwonisz pod numeranother_method
pousing
, samo połączenie zmy_method
dzieje się przedusing
- dlatego nazywa oryginalną, nierafinowaną wersję metody.
To całkowicie mnie podnieca.
Dlaczego MyClass.new.another_method
wyświetla "oryginalny my_method()" od czasu jego użycia po using MyClassRefinement
i co autor próbuje tu powiedzieć?
Czy ktoś mógłby przedstawić bardziej intuicyjne/lepsze wyjaśnienie?
Dzięki.
Prawdopodobnie dlatego, że ponowne odwzorowanie wprowadzone przez udoskonalenia dotyczy tylko określonego zakresu, a w obrębie tej oryginalnej definicji zakres pozostaje nienaruszony. – tadman