使用多个模块扩展的对象中的方法的Ruby优先级

鉴于以下内容:

class User; attr_accessor :roles; end module RegisteredUser def default_context Submission end end module Admin def default_context Review end end current_user = User.new current_user.roles = ["registered_user", "admin"] current_user.roles.each do |role| role_module = role.gsub(/ /, '_').camelize if module_exists?(role_module) current_user.extend role_module.constantize end end context = self.extend current_user.default_context 

有没有办法设置User#default_context的优先级? 也就是说,无论current_user的扩展顺序如何,我是否可以说Admin#default_context始终优先于RegisteredUser#default_context

method_addedModule

我实际上意味着included ,而不是extended ,但两者也在Module

这种机制将围绕这样做:

 module Foo def self.included(base) base.extend(FooMethods) end module FooMethods def bar # Whatever end end end 

Foo.included您可以根据任意标准确定是否应将相关方法添加到base (包含模块的实体)。

在您的情况下,您可以检查是否已包含“更高优先级”模块,或查看模块是否为“更高优先级”模块。 基于此,您决定是否添加方法。

由于Admin也是RegisteredUser,我会这样做

 module Admin include RegisteredUser ... end 

然后只

 current_user.extend Admin 

我不确定这是不是正确的方法。 如果Admin和RegisteredUser是类,那么使Admin从RegisteredUserinheritance是有意义的。 在模块的情况下,不知道。

你不能; 在Ruby中,模块包含的顺序是搜索模块的顺序( 在当前类之后,在父类之前 )。 更改“优先级”的唯一方法是按所需顺序包含模块,或将它们移动到父类。

虽然不是纯Ruby,但您可以使用banisterfiend的Remix库来更改模块排序(或取消复制模块或其他内容)。