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

在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 =”,以便它被parsing并正确地传递给定义的? 运营商。

问题是foo=方法被devise用于赋值。 你可以使用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" 

要testingfoo=方法是否已定义,您应该使用respond_to? 代替:

 respond_to? :foo= #=> false def foo=(bar) end respond_to? :foo= #=> true 

你可以通过使用respond_to?检查一个方法是否存在respond_to? 方法,并将其传递给一个符号,例如bar.respond_to?(:foo=)来查看对象bar是否有方法foo= 。 如果你想知道一个类的实例是否响应一个方法,你可以使用method_defined? 在类(或模块)上,例如Foo.method_defined?(:bar=)

defined? 不是一个方法,而是一个返回操作数描述的操作符(如果没有定义,则为nil,这就是为什么它可以在if语句中使用)。 操作数可以是任何expression式,即一个常量,一个variables,一个赋值,一个方法,一个方法调用等等。当你defined?(foo=)不工作的原因是因为括号,skip他们应该或多或less按预期工作。 这是说, defined? 是一个相当奇怪的操作符,没有人用它来testing方法的存在。