gpt4 book ai didi

perl - Moose 属性初始化

转载 作者:行者123 更新时间:2023-12-04 14:59:01 28 4
gpt4 key购买 nike

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

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

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

这些日期以字符串形式出现,但我需要将它们格式化为特定的日期格式 (ISO8601),如果没有 Moose,我只会在 new() 中初始化它们但我不确定与驼鹿。

阅读文档的可行选项似乎在 BUILDARGS , BUILD ,或使用强制。鉴于我有一个函数 _format_as_iso8601(),以下哪一个最合适?可以获取日期并以正确格式返回它吗?

最佳答案

BUILD在构造函数之后调用,这使得验证状态很方便,但不一定对格式化传入参数有用。
BUILDARGS将允许您在调用构造函数之前修改传入参数,这使其更适合这种情况。你的属性是只读的,所以这可以工作。

但是......如果你渴望静态类型,你为什么要在 promise “这是一个字符串”之后停下来?如果您创建一个 subtype对于 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);

关于perl - Moose 属性初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22104385/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com