remove_method
powinny działać w większości przypadków. Ale jeśli alias_method
nadpisuje istniejący sposób, może być konieczne, aby zachować oryginalne poprzez oddzielny alias_method
rozmowy.
# assuming :contains? is already a method
alias_method :original_contains?, :contains?
alias_method :contains?, :include?
Następnie w celu przywrócenia pierwotnego stanu:
alias_method :contains?, :original_contains?
remove_method :original_contains? # optional
Należy również zauważyć, że zmiana klasy, który jest używany w wielu wątków jest podatna na wyścig warunki. A jeśli próbujesz uniemożliwić używanie bibliotek przez alias, nie możesz temu zapobiec, jeśli wywołujesz metody tych bibliotek, gdy istnieje alias. Możemy zobaczyć, jak to zrobić w Ruby 2.0: http://yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice/
Byłoby pomocne, gdybyś mógł powiedzieć, dlaczego chcesz usunąć alias. Jeśli nazwa metody nie istniała wcześniej, żadna inna biblioteka nie powinna być dotknięta łatą małpy. Ponadto powinieneś rozważyć podklasowanie String
(lub delegowanie do instancji łańcucha znaków) zamiast łatania String
.
'remove_method' jest lepsze, jeśli' hi' był pierwotnie dziedziczony lub zmieszany. Użycie 'undef' lub' undef_method' uniemożliwi rozmowom propagowanie łańcucha dziedziczenia/łączenia. – Kelvin
Naprawdę edytowałem swoją odpowiedź, aby odzwierciedlić to, gdy skomentowałeś = D –