如何检查method_defined?来自类中使用的模块,该模块包含之后定义的方法



如何定义一个模块来检查使用该模块的类中是否存在实例方法。模块通常包含在文件的开头,而方法则在后面定义。我正在使用Rails。

带有挂钩的模块

module MyModule
extend ActiveSupport::Concern
included do
raise "Foo" if method_defined? :bar
end 
end 

以下代码中从未引发Foo错误,我如何获得该错误?

class MyClass 
include MyModule
def bar
puts "Hello from Bar"
end 
end 

以下代码中出现Foo错误:

class MyOtherClass 
def bar
puts "Hello from Bar"
end 
include MyModule
end 

这是一个纯Ruby的答案。我不知道Rails是否支持Ruby不支持的回调,这在这里会有用。

正如@Amadan所指出的,该模块不是一个读心术的模块;要查看在类上定义的实例方法,需要在包含模块之前定义该方法。方法Module#included将包含它的模块作为参数。这是需要的,因为当执行该方法时selfMyModule

module MyModule
def self.included(mod)
puts "self = #{self}"
puts ":bar is defined" if mod.method_defined? :bar
puts ":foo is defined" if mod.method_defined? :foo
puts ":goo is defined" if mod.method_defined? :goo
end
def goo
end  
end 
class MyClass 
def bar
end 
include MyModule
end

打印

self = MyModule
:bar is defined
:goo is defined

注意,在MyClass中包括在MyModule(goo(中定义的实例方法之后执行Module#included

相关内容

  • 没有找到相关文章

最新更新