如何定义一个模块来检查使用该模块的类中是否存在实例方法。模块通常包含在文件的开头,而方法则在后面定义。我正在使用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将包含它的模块作为参数。这是需要的,因为当执行该方法时self
是MyModule
。
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
。