在Moose :: Role中为MooseX :: ClassAttribute编写构建器

时间:2016-01-19 23:05:44

标签: perl moose

我想用Class属性和构建器定义Role。无论我尝试过什么,这都失败了。我找到了两个解决方法:

  1. 不使用class属性而是使用plain属性。这在我的情况下是有问题的,因为我想在我的真实代码中修改属性(对于所有实例)。
  2. 将构建器放入类中(而不是放入角色中)。它也有问题,因为它意味着修改所有使用此角色的类。
  3. 这是一个最小的例子:

    "5+4"

    结果:

    first_num_str,second_num_str = pair1.split("+") 
    first_num = int(first_num_str)
    second_num = int(second_num_str)
    result = first_num + second_num
    print(str(result))
    

    更新:我通过添加' lazy =>解决方法1&#39 ;.然后它完美地运作。如果没有' lazy',可能会在角色完全导入之前调用构建器。

1 个答案:

答案 0 :(得分:1)

在此上下文中使用lazy并不是解决方法,而是正确的解决方案。 MooseX::ClassAttribute实施为Moose::Role。在MyRole完全合并到Appli之前,Perl会调用class_has,它会尝试将_build_value作为Appli类的方法调用。由于该方法尚未组成AppliMooseX::ClassAttribute因上述错误而死亡。使用lazy推迟对_build_value的评估,直到MyRole完全合并到Appli