驼鹿属性初始化

Hun*_*len 6 validation perl moose

使用Moose时,某些属性的自定义初始化的典型方法是什么?

例如,假设我将字符串格式的两个日期作为我班级的输入:

has startdate  => (is => 'ro', isa => 'Str', required => 1);
has enddate    => (is => 'ro', isa => 'Str');
Run Code Online (Sandbox Code Playgroud)

这些日期以字符串形式出现,但我需要以特定日期格式(ISO8601)格式化它们,没有Moose我会初始化它们new()但我不确定与Moose.

看来,从阅读文档的可行的选择是BUILDARGS,BUILD或使用胁迫.鉴于我有一个_format_as_iso8601()可以记录日期并正确格式化的函数,这些中哪一个最合适?

rut*_*ter 6

BUILD 在构造函数之后调用,这使得它可以方便地验证状态,但不一定有助于格式化传入的参数.

BUILDARGS可以让你在调用构造函数之前修改传入的参数,这使它更适合这种情况.您的属性是只读的,因此可以使用.

但是......如果你渴望静态打字,为什么你会在承诺"这是一个字符串"后停止?如果为ISO8601字符串创建子类型,则可以保证"这是一个字符串,它具有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);
Run Code Online (Sandbox Code Playgroud)

  • 我的类型:: XSD具有内置的日期类型约束.这是[从字符串中强制执行的示例](https://gist.github.com/tobyink/9280334).该类型是可参数化的,允许您使用类型约束,如`Date [minInclusive =>'1970-01-01']`. (3认同)