В Ruby, как я могу проверить, определен ли метод "foo = ()"? - PullRequest
68 голосов
/ 27 февраля 2010

В Ruby я могу определить метод foo = (bar):

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 =", такой, чтобы он был разобран и правильно передан определенному? оператор.

Ответы [ 2 ]

117 голосов
/ 27 февраля 2010

Проблема в том, что метод 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=, вместо него следует использовать respond_to?:

respond_to? :foo=
#=> false

def foo=(bar)
end

respond_to? :foo=
#=> true
34 голосов
/ 04 июня 2010

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

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

...