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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

在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 =”,以便它被解析并正确地传递给定义?

提问于
用户回答回答于

问题在于该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
用户回答回答于

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

defined?不是一种method,而是一个返回操作数描述的操作符(或者,如果它没有被定义,则为nil,这就是为什么它可以用在if语句中)。操作数可以是任何表达式,即一个常量,一个变量,一个赋值,一个方法,一个方法调用等等。当你这样做的时候,它不起作用的原因defined?(foo=)是因为括号,跳过它,它应该更多地工作如预期的那样。这就是说,defined?是一个非常奇怪的运算符,没有人用它来测试方法的存在。

扫码关注云+社区