如何让Moo在构造函数传入未知属性时给出诊断提示?
解决Moo中传入未知属性时的报错问题
Moo本身没有内置的严格属性校验功能,但可以通过以下两种方式实现你的需求,同时满足避免Moo::sification的要求:
方法1:使用MooX::StrictConstructor轻量模块
这是Moo生态中专门解决此类问题的常用"Tiny"扩展,依赖极小,使用简单:
package Fno { use Moo; use MooX::StrictConstructor; has x => ( is=>'ro', default=>0 ); } # 执行此代码会抛出异常:Unknown attribute(s): y Fno->new( y=>2 );
该模块会自动在调用new时校验所有传入参数,一旦发现未定义的属性直接报错,完全不影响现有属性的默认值设置。
方法2:手动实现校验(无需额外模块)
如果不想引入外部依赖,可以通过BUILDARGS方法自行验证参数:
package Fno { use Moo; has x => ( is=>'ro', default=>0 ); sub BUILDARGS { my ($class, %args) = @_; my %allowed_attrs = map { $_ => 1 } $class->meta->get_attribute_list; for my $key (keys %args) { die "Unknown attribute: $key" unless exists $allowed_attrs{$key}; } return \%args; } } # 执行此代码会抛出错误:Unknown attribute: y Fno->new( y=>2 );
这里利用Moo原生的meta对象获取已定义属性列表,对比传入参数后拦截未知属性,全程无需启用Moo::sification。
内容的提问来源于stack exchange,提问作者pipe
相关产品推荐
相关产品推荐

