Moose::Manual::Attributes指出:


作为使用子例程引用的替代方法(默认),您可以改为为属性提供一个生成器方法:
...
这具有几个优点。首先,它将大量代码移到其自己的命名方法中,从而提高了可读性和代码组织性。


因此,您的属性可以这样定义一个默认值:

has attr => (
  is => 'ro',
  builder => 'subroutine'
);
sub subroutine {
  # figure out and return default value
}


我不明白为什么这必须与默认设置分开。您不能仅将引用传递给已命名的子例程吗?

has attr => (
  is => 'ro',
  default => \&subroutine
);


并确保您不会偶然引用不存在的子例程,这不是更好的编程实践吗?您将使用逻辑引用而不是符号引用来引用该方法。

最佳答案

调用构建器时,会发生以下情况:

$object->$builder


如果builder是字符串(例如build_attr),则用户可以在子类中编写自己的build_attr方法,然后将调用该方法。这可以通过简单的命名方法机制扩展默认值。

如果是对子例程的引用,则该引用将在原始类的包中获取,这意味着不能以相同的方式覆盖它。

08-17 12:02