【发布时间】:2021-08-26 00:17:17
【问题描述】:
如何定义一个模块来检查使用该模块的类中是否存在实例方法。该模块通常包含在文件的开头,而方法是在之后定义的。我正在使用 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 在类定义中执行指令,就像任何其他指令序列一样,一条一条地执行。当时
include MyModule,MyClass还没有bar。您需要一台时间机器才能知道bar将在未来被定义。 -
写一个异常块。如果未定义该方法,它将引发错误,因此您可以使用一些代码块来挽救它
标签: ruby-on-rails ruby module mixins