在Ruby中,如何检查方法“foo =()”是否已定义?

时间:2010-02-27 18:54:49

标签: ruby syntax-error

在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 个答案:

答案 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?是一个非常奇怪的运算符,没有人用它来测试方法的存在。