od fine manual:
undef_method (symbol) → siebie
Zapobiega aktualną klasę z reaguje na wezwania do nazwanego metody. Porównaj to z remove_method
, który usuwa metodę z konkretnej klasy; Ruby będzie nadal wyszukiwać superklasy i mieszane moduły dla możliwego odbiorcy.
Więc remove_method
tak:
class CC < C
remove_method :m
end
jest w zasadzie przeciwieństwem tego:
class CC < C
def m
end
end
Gdzie def m
dodaje metodę m
do klasy, remove_method :m
usuwa m
. Ale jeśli super klasa ma metodę m
, to nadal będzie używana.
undef_method
, OTOH, jest bardziej jak to:
class CC < C
def m
raise 'No, you cannot do that.'
end
end
Więc undef_method
faktycznie nie usunąć metodę, zastępuje metodę specjalną flagą wewnętrznego, które powoduje Ruby narzekać, jeśli starają się nazwać metoda.
Brzmi jak próbujesz zastąpić istniejące metody i zastąpić jest semantycznie taka sama jak usunięcia następnie przez dodać tak remove_method
jest chyba bardziej odpowiednie. Jednakże, jeśli chcesz być paranoikiem i upewnić się, że metoda wymiany jest na miejscu, to przydałby się undef_method
; lub, jeśli z jakiegoś powodu musisz usunąć metodę w jednym miejscu i dodać ją w innym, undef_method
powie Ci przynajmniej, że wykonałeś tylko połowę pracy, podczas gdy remove_method
albo zostawiłoby ci implementację superklasy (i możliwe dziwne błędy) lub raczej mylące NoMethodError
.
Wypasione wyjaśnień. –