在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方法的存在。