Moose :: Manual :: Attributes说明:
作为使用子程序引用[默认]的替代方法,您可以为属性提供构建器方法:...这有几个优点.首先,它将一大块代码移动到自己的命名方法,从而提高了可读性和代码组织.
因此,您的属性可以因此定义默认值:
has attr => (
is => 'ro',
builder => 'subroutine'
);
sub subroutine {
# figure out and return default value
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这必须与默认分开.难道你不能只是传递对命名子程序的引用吗?
has attr => (
is => 'ro',
default => \&subroutine
);
Run Code Online (Sandbox Code Playgroud)
那不是更好的编程实践,因为你保证不会意外地引用一个不存在的子程序吗?您将使用逻辑引用而不是符号引用来引用该方法.
rjb*_*jbs 14
调用构建器时,会发生以下情况:
$object->$builder
Run Code Online (Sandbox Code Playgroud)
如果builder是一个字符串(比如说build_attr),那么用户可以在子类中编写自己的build_attr方法,然后调用它.这使得默认值可通过简单的命名方法机制进行扩展.
如果它是对子例程的引用,则引用将在原始类的包中进行,这意味着它不能以相同的方式覆盖.
Dav*_*sky 10
这不是一个"象征性的"参考.构建器是方法名称.这意味着它可以从角色继承和组合.如果传递子例程引用,则该引用必须存在于同一个包中(或者是完全限定的).
我很确定我在手册中解释了这一点.不清楚吗?
小智 7
子类.
Builder指定要调用的方法名称,所以
package Something;
use Moose;
extends 'YourClass';
sub subroutine { <some other default> }
Run Code Online (Sandbox Code Playgroud)
将Something :: subroutine调用为'子例程'的构建器,而如果你使用了subref样式,那么将调用YourClass ::子例程,因为你已直接引用子例程而不是让它通过方法调度.
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |