В Ruby я могу определить нечто метода = (панель):
irb(main):001:0> def foo=(bar)
irb(main):002:1> p "foo=#{bar}"
irb(main):003:1> end
=> nil
Теперь я хотел бы проверить, было ли это определено,
irb(main):004:0> defined?(foo=)
SyntaxError: compile error
(irb):4: syntax error, unexpected ')'
from (irb):4
from :0
Что правильный синтаксис состоит в том, чтобы использовать здесь? Я предполагаю, что должен быть способ выйти "из нечто =" таким образом, что это анализируется и передается правильно определенному? оператор.
Проблема в том, что метод foo =
разработан для использования в присвоениях. Вы можете использовать defined?
следующим образом, чтобы увидеть, что происходит:
defined? self.foo=()
#=> nil
defined? self.foo = "bar"
#=> nil
def foo=(bar)
end
defined? self.foo=()
#=> "assignment"
defined? self.foo = "bar"
#=> "assignment"
Сравните это с:
def foo
end
defined? foo
#=> "method"
Чтобы проверить, определен ли метод foo =
, вы должны использовать response_to?
вместо:
respond_to? :foo=
#=> false
def foo=(bar)
end
respond_to? :foo=
#=> true
Вы можете проверить, существует ли метод с помощью метода response_to?
, и передать ему символ, например bar.respond_to? (: Foo =)
, чтобы узнать, есть ли у объекта bar
метод foo =
. Если вы хотите знать, отвечают ли экземпляры класса на метод, вы можете использовать method_defined?
в классе (или модуле), например Foo.method_defined? (: Bar =)
.
defined?
не метод, а оператор, который возвращает описание операнда (или nil, если он не определен, поэтому его можно использовать в операторе if). Операндом может быть любое выражение, то есть константа, переменная, присваивание, метод, вызов метода и т. Д. Причина, по которой он не работает, когда вы определяете ? (Foo =)
, является из-за скобок пропустите их, и все должно работать более или менее, как ожидалось. При этом defined?
- довольно странный оператор, и никто не использует его для проверки существования методов.