是否可以使用MooseMooseX :: Declare for Perl自动强制传递给委托方法的参数(来自Array特征)?

是否可以使用MooseMooseX :: Declare for Perl自动强制传递给委托方法的参数(来自Array特征)?,第1张

概述我正在创建一个包含IP地址列表的类,作为Net :: IP对象. 我将Net :: IP对象包装为子类型(IPAddress),并定义了从字符串到IPAddress的强制.然后我使用类型ArrayRef [IPAddress]向名为ip_list的类添加了一个属性,并委托给Array trait的push方法. use MooseX::Declare;use Moose::Util::TypeC 我正在创建一个包含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',},);
总结

以上是内存溢出为你收集整理的是否可以使用Moose / MooseX :: Declare for Perl自动强制传递给委托方法的参数(来自Array特征)?全部内容,希望文章能够帮你解决是否可以使用Moose / MooseX :: Declare for Perl自动强制传递给委托方法的参数(来自Array特征)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存