穆斯"建设者"与"默认"

Sch*_*ern 15 perl moose

我理解使用builderenable子类可以轻松覆盖属性默认值,角色可以覆盖require它们.这也可以使用default如下方式完成:

has 'foo' =>
    is       => 'rw',
    isa      => 'Str',
    default  => sub { $_[0]->_build_foo };
Run Code Online (Sandbox Code Playgroud)

我想知道使用builder我还没有进一步的优势吗?我自己想出了一些:

  • builder是声明性的,所以你可以反省foo内置_build_foo
  • builder 消除了子程序包装,使其更快一些
  • builder允许使用有用的lazy_build.

UPDATE 为了澄清,这是不是defaultVS builder一般,但default => sub { $_[0]->_build_foo }VS builder => '_build_foo'.

hob*_*bbs 12

我想你已经回答了自己的问题.使用builder允许后期绑定,它可以很好地与要创建子类的角色和类一起使用.如果构建器很长,它也很有价值 - 我从不default在属性定义中添加超过一行.没有真正的功能差异; default可以很容易地模仿builder,但结果不是很漂亮.

  • @ikegami因为`\&builder`将被解析为当前包中的`&builder`.提供新的"builder"的子类必须再次执行`has'+ attr'=> builder => \&builder`以将其绑定到重写的方法.OTOH`builder =>'builder'`在运行时解析. (2认同)