我正在尝试检查是否在使用Module.method_defined?(:method)
的模块中定义了一个方法,并且它返回false,它应该返回true。
module Something
def self.another
1
end
end
Something.methods
列出了“其他”,但Something.method_defined?(:another)
返回false
。
这可能不起作用,因为该方法是在自我定义的吗?如果是这种情况,还有另一种方法来检查是否在模块上定义了方法而不是使用method_defined?
?
答案 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