使用Moose时,某些属性的自定义初始化的典型方法是什么?
例如,假设我将字符串格式的两个日期作为我班级的输入:
has startdate => (is => 'ro', isa => 'Str', required => 1);
has enddate => (is => 'ro', isa => 'Str');
这些日期以字符串形式出现,但我需要格式化为特定日期格式(ISO8601),没有Moose我会在new()
初始化它们但我不确定是否与Moose一起使用。
阅读文档的可行选项似乎在BUILDARGS
,BUILD
或使用强制。考虑到我有一个函数_format_as_iso8601()
可以获取日期并正确地返回格式,这些中哪一个最合适?
答案 0 :(得分:5)
BUILD
,这样可以方便地验证状态,但不一定有助于格式化传入的参数。
BUILDARGS
可以让你在调用构造函数之前修改传入的参数,这使得它更适合这种情况。您的属性是只读的,因此可以使用。
但是......如果你渴望静态打字,为什么你会在承诺“这是一个字符串”后停止?如果为ISO8601字符串创建subtype,则可以保证“这是一个字符串并且它具有X格式”。更好的是,你这样做的方式可以立即轻松地移植到其他属性。
我很怀疑下面的正则表达式对你有用,但我希望它能解决这个问题:
#define the type
subtype 'iso8601',
as 'Str',
where { /\d{4}-\d{2}-\d{2}/ },
message { "Not a valid ISO8601 string ($_)" };
#provide a coercion
coerce 'iso8601',
from 'Str',
via { _format_as_iso8601 $_ };
#tell moose to coerce the value
has startdate => (is => 'ro', isa => 'iso8601', required => 1, coerce => 1);