代码之家  ›  专栏  ›  技术社区  ›  Alex Boisvert

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

  •  66
  • Alex Boisvert  · 技术社区  · 16 年前

    在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 回复  |  直到 14 年前
        1
  •  113
  •   molf    16 年前

    问题是 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"
    

    测试 Fo= 方法已定义,应使用 respond_to? 而是:

    respond_to? :foo=
    #=> false
    
    def foo=(bar)
    end
    
    respond_to? :foo=
    #=> true
    
        2
  •  33
  •   Theo    14 年前

    您可以使用 respond_to? 方法,然后传递一个符号,例如。 bar.respond_to?(:foo=) 看看这个物体 bar 有一种方法 foo= . 如果您想知道类的实例是否响应您可以使用的方法 method_defined? 在类(或模块)上,例如 Foo.method_defined?(:bar=) .

    defined? 不是方法,而是返回操作数描述的运算符(如果未定义,则返回nil,这就是为什么可以在if语句中使用它的原因)。操作数可以是任何表达式,例如常数、变量、赋值、方法、方法调用等。这样做时,它不起作用的原因 defined?(foo=) 是因为括号,跳过它们,它应该或多或少地按预期工作。尽管如此, 定义? 是一个非常奇怪的操作符,没有人用它来测试方法的存在性。

    推荐文章