在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=
,这样它才能被解析并正确地传递给defined?
运算符。
2条答案
按热度按时间brvekthn1#
问题是
foo=
方法被设计用于赋值。您可以通过以下方式使用defined?
来查看发生了什么:比较一下:
要测试是否定义了
foo=
方法,应该使用respond_to?
:jm2pwxwz2#
你可以使用
respond_to?
方法来检查一个方法是否存在,并向它传递一个符号,例如。bar.respond_to?(:foo=)
来查看对象bar
是否有方法foo=
。如果你想知道一个类的示例是否响应一个方法,你可以在这个类(或模块)上使用method_defined?
,例如Foo.method_defined?(:bar=)
。defined?
不是一个方法,而是一个返回操作数描述的操作符(如果没有定义,则返回nil,这就是为什么它可以在if语句中使用)。操作数可以是任何表达式,即常量、变量、赋值、方法、方法调用等。当你执行defined?(foo=)
时,它不工作的原因是因为括号,跳过它们,它应该或多或少地像预期的那样工作。话虽如此,defined?
是一个非常奇怪的操作符,没有人用它来测试方法的存在性。