Ответ 1
undef_method (символ) → self
Предотвращает реакцию текущего класса на вызовы по указанному методу. Контрастируйте это с помощью
remove_method
, который удаляет метод из определенного класса; Ruby будет по-прежнему искать суперклассы и смешанные модули для возможного приемника.
Итак, remove_method
:
class CC < C
remove_method :m
end
по существу противоположно этому:
class CC < C
def m
end
end
Где def m
добавляет метод m
в класс, remove_method :m
удаляет m
. Но если суперкласс имеет метод m
, то он все равно будет использоваться.
undef_method
, OTOH, больше похоже на это:
class CC < C
def m
raise 'No, you cannot do that.'
end
end
Итак, undef_method
фактически не удаляет этот метод, он заменяет метод специальным внутренним флагом, который заставляет Ruby жаловаться, если вы попытаетесь вызвать этот метод.
Похоже, вы пытаетесь заменить существующий метод, и заменить семантически то же самое, что и удаление, за которым следует добавление, поэтому remove_method
, вероятно, более уместно. Однако, если вы хотите быть параноидальным и убедиться, что метод замены на месте, тогда undef_method
будет полезен; или, если по какой-то причине вам нужно удалить метод в одном месте и добавить его в другое, undef_method
, по крайней мере, скажет вам, что вы выполнили только половину задания, тогда как remove_method
либо оставит вас с реализацией суперкласса ( и возможные странные ошибки) или довольно запутанный NoMethodError
.