Вы можете проверить, существует ли метод, используя метод respond_to?
, и вы передаете ему символ, например, bar.respond_to?(:foo=)
чтобы увидеть, есть ли у объекта bar
метод foo=
. Если вы хотите знать, реагируют ли экземпляры класса на метод, вы можете использовать method_defined?
в классе (или модуле), например, Foo.method_defined?(:bar=)
.
defined?
не метод, а оператор, который возвращает описание операнда (или nil, если он не определен, поэтому его можно использовать в операторе if). Операндом может быть любое выражение, то есть константа, переменная, присваивание, метод, вызов метода и т. Д. Причина, по которой он не работает, когда вы выполняете defined?(foo=)
, заключается в скобках, пропустите их и должен работать более или менее, как ожидалось. При этом defined?
- довольно странный оператор, и никто не использует его для проверки существования методов.