加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – Moose属性初始化

发布时间:2020-12-16 06:25:29 所属栏目:大数据 来源:网络整理
导读:使用Moose时,某些属性的自定义初始化的典型方法是什么? 例如,假设我将字符串格式的两个日期作为我班级的输入: has startdate = (is = 'ro',isa = 'Str',required = 1);has enddate = (is = 'ro',isa = 'Str'); 这些日期以字符串形式出现,但是我需要以特定
使用Moose时,某些属性的自定义初始化的典型方法是什么?

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

has startdate  => (is => 'ro',isa => 'Str',required => 1);
has enddate    => (is => 'ro',isa => 'Str');

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

阅读文档的可行选项似乎是在BUILDARGS,BUILD或使用强制.考虑到我有一个函数_format_as_iso8601()可以获取日期并正确返回格式,这些中哪一个最合适?

解决方法

在构造函数之后调用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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读