我注意到在使用module_eval
的Rails源代码中有一些地方。一个地方在ActiveRecord::Enum,另一个在ActiveRecord::Store。我熟悉class_eval
和instance_eval
并用他们扩展现有的类或对象的功能,但在module_eval
的情况下,好像它服务于不同的目的。为什么Active Record在内部为某些功能使用module_eval?
在这两种情况下,他们使用的是类似的模式来定义模块:
def _store_accessors_module
@_store_accessors_module ||= begin
mod = Module.new
include mod
mod
end
end
如果被包含在它的定义在类模块,有什么好处是有定义一个嵌套模块中的相关方法喜欢这个?是否更好地隔离代码?我问的原因是因为我有一个为Active Record增加功能的创业板,我想知道这种做法是否更像是做同样事情的“最佳做法”。 Here's the relevant source code of my gem仅供参考。
感谢您的详细解释! –