在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 =”,以便它被解析并正确传递给定义的?操作
答案 0 :(得分:114)
问题是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
答案 1 :(得分:34)
您可以使用respond_to?
方法检查方法是否存在,并将符号传递给它,例如bar.respond_to?(:foo=)
以查看对象bar
是否有方法foo=
。如果您想知道类的实例是否响应方法,您可以在类(或模块)上使用method_defined?
,例如Foo.method_defined?(:bar=)
。
defined?
不是一个方法,而是一个返回操作数描述的运算符(如果没有定义则为nil,这就是为什么它可以在if语句中使用)。操作数可以是任何表达式,即常量,变量,赋值,方法,方法调用等。当你执行defined?(foo=)
时它不起作用的原因是由于括号,跳过它们它应该或多或少地按预期工作。话虽如此,defined?
是一个非常奇怪的运算符,没有人用它来测试方法的存在。