使用多个模块扩展的对象中的方法的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_added
在Module
。
我实际上意味着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库来更改模块排序(或取消复制模块或其他内容)。