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方法,然后将调用该方法。这可以通过简单的命名方法机制扩展默认值。如果是对子例程的引用,则该引用将在原始类的包中获取,这意味着不能以相同的方式覆盖它。