perl – 为什么Moose的构建器采用字符串值?

Moose::Manual::Attributes州:

As an alternative to using a subroutine reference [for default],you can instead supply a builder method for your attribute:

This has several advantages. First,it moves a chunk of code to its own named method,which improves readability and code organization.

因此,您的属性可以定义认值:

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方法,然后调用它.这使得认值可通过简单的命名方法机制进行扩展.

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

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...