为什么Module.method_defined?(:方法)不能正常工作?

时间:2009-12-31 03:54:06

标签: ruby

我正在尝试检查是否在使用Module.method_defined?(:method)的模块中定义了一个方法,并且它返回false,它应该返回true。

module Something
  def self.another
    1
  end
end

Something.methods列出了“其他”,但Something.method_defined?(:another)返回false

这可能不起作用,因为该方法是在自我定义的吗?如果是这种情况,还有另一种方法来检查是否在模块上定义了方法而不是使用method_defined?

3 个答案:

答案 0 :(得分:11)

要知道模块是否有模块方法,你可以使用respond_to吗? 在...上 模块:

Something.respond_to?(another)
=> true

method_defined?会告诉你包含模块的类的实际是否响应给定的方法。

答案 1 :(得分:5)

模块方法在其元类中定义。因此,您还可以使用以下方法检查方法包含:

k = class << Something; self; end # Retrieves the metaclass
k.method_defined?(:another)  #=> true

您可以在Understanding Ruby Metaclasses中了解更多相关信息。

答案 2 :(得分:0)

我要添加答案的版本

使用singleton_methods方法:

module Something
  def self.another
  end
end

Something.singleton_methods.include?(:another) #=> true, with all parent modules
Something.singleton_methods(false).include?(:another) #=> true, will check only in the Something module