是否可以使用Moose / MooseX :: Declare for Perl自动强制传递给
发布时间:2020-12-16 06:27:16 所属栏目:大数据 来源:网络整理
导读:我正在创建一个包含IP地址列表的类,作为Net :: IP对象. 我将Net :: IP对象包装为子类型(IPAddress),并定义了从字符串到IPAddress的强制.然后我使用类型ArrayRef [IPAddress]向名为ip_list的类添加了一个属性,并委托给Array trait的push方法. use MooseX::Dec
我正在创建一个包含IP地址列表的类,作为Net :: IP对象.
我将Net :: IP对象包装为子类型(IPAddress),并定义了从字符串到IPAddress的强制.然后我使用类型ArrayRef [IPAddress]向名为ip_list的类添加了一个属性,并委托给Array trait的push方法. use MooseX::Declare; use Moose::Util::TypeConstraints; use Net::IP; subtype 'IPAddress' => as 'Object' => where { $_->isa('Net::IP') }; coerce 'IPAddress' => from 'Str' => via { Net::IP->new( $_ ) }; class IPs { has 'ip_list' => ( traits => ['Array'],isa => 'ArrayRef[IPAddress]',is => 'rw',coerce => 1,auto_deref => 1,default => sub { [] },handles => { add_ip => 'push' } ); } 但是,如果我尝试像这样调用委托方法: my $o = IPs->new(); $o->add_ip( '192.168.0.1' ); 我得到错误“值SCALAR(0x8017e8)没有传递容器类型约束’IPAddress’在…” 很明显,add_ip的参数没有被强制执行. 是否有可能做我正在尝试的事情,或者我应该手动完成所有这些操作?我已经浏览了Moose手册,但我没有看到任何表明任何方式的东西,但我可能遗漏了一些东西. 解决方法
不幸的是,Moose没有强制链接(在内部解析这些并且弄清楚“正确的事情”是自动化的方式会非常复杂),所以你需要自己定义链:
use Net::IP; class_type 'Net::IP'; coerce 'Net::IP' => from 'Str' => via { Net::IP->new( $_ ) }; subtype 'ArrayRefOfIPAddresses' => as 'ArrayRef[Net::IP]'; coerce 'ArrayRefOfIPAddresses' => from 'ArrayRef[Str]' => via { [ map { Net::IP->new($_) } @$_ ] }; coerce 'ArrayRefOfIPAddresses' => from 'Str' => via { [ Net::IP->new($_) ] }; coerce 'ArrayRefOfIPAddresses' => from 'Net::IP' => via { [ $_ ] }; class IPs { has 'ip_list' => ( traits => ['Array'],isa => 'ArrayRefOfIPAddresses',# ... rest of declaration as before ); } PS.既然您正在使用Array本机委托特征,我建议您避免使用auto_deref – 而是添加处理程序: has ip_list => ( is => 'bare',# ... handles => { # ... ip_list => 'elements',},); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |