В Ruby, как я проверяю, определяется ли метод “нечто = ()”?

В 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

Что правильный синтаксис состоит в том, чтобы использовать здесь? Я предполагаю, что должен быть способ выйти "из нечто =" таким образом, что это анализируется и передается правильно определенному? оператор.

71
задан Alex Boisvert 27 February 2010 в 18:54
поделиться

2 ответа

Проблема в том, что метод 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
120
ответ дан 24 November 2019 в 12:58
поделиться

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

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

35
ответ дан 24 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: