代码之家  ›  专栏  ›  技术社区  ›  xenoterracide

我可以命令作为traits的一部分加载的方法修饰符吗?

  •  2
  • xenoterracide  · 技术社区  · 15 年前

    这是对 previous question around 修饰符,有没有可能确保一个特定的执行顺序(因为我无法确定哪个会被加载)?或者我真的只能通过我编写的代码和文档来控制它吗?

    示例:我有3个角色,每个角色都有一个 特质 但如果加载了超过1个,则必须按特定顺序加载才能正常工作。e、 按顺序加载特性abc,工作正常,但像特性bac一样加载会导致行为不稳定。

    有没有一种方法可以防止用户(程序员)以错误的顺序加载它们。

    3 回复  |  直到 8 年前
        1
  •  1
  •   perigrin    15 年前

    简短的回答是“不”。方法修饰符是有序的,角色自然是无序的。这种组合冲突是角色中的方法修饰符充满危险的原因之一,您很少看到它用于任何复杂的领域。

    用户也以无序而闻名。Moose提供了很少的工具来强制角色的有序组合(通过设计)。用户空间中肯定没有任何东西会约束它们。

    如果不多了解你的具体问题,我无法提出更好的解决办法。一般来说,我希望注册回调并以某种方式触发它,而不是依赖于方法修饰符。

        2
  •  1
  •   cjm    15 年前

    引用 Moose::Manual::MethodModifiers (就在为什么要使用它们之前?)。

    同样的类型,前面和周围 修改器从最后添加到 第一个和第二个修饰符运行 从最初添加到最后:

    2之前

    大约2



    大约2
    1之后

    这个想法是你正在修改这个方法 就在那一刻 .

        3
  •  1
  •   Ether    15 年前

    这是一个非常主观的答案,取决于您的系统的体系结构,您还没有描述。但有一种方法是,你可以将角色“你自己”应用到另一个角色中,然后只应用到类中:

    package OmniRole;
    use Moose::Role;
    
    with 'RoleA',' RoleB', 'RoleC';  # these roles contain the 'around' method modifier
    
    
    package User::Class;
    use Moose;
    
    with 'OmniRole';    # wraps method 'foo' several times to do magic.
    
    推荐文章