gpt4 book ai didi

perl - 使 Moose 构造函数忽略 undef 参数

转载 作者:行者123 更新时间:2023-12-03 18:18:19 24 4
gpt4 key购买 nike

哈希表是 Perl 对象的典型初始化程序。现在您的输入是不可靠的,因为您不知道对于任何给定的键是否会有定义的值,也不知道键是否存在。现在您想将这种不可靠的输入提供给 Moose 对象,虽然没有键是完全可以的,但您确实希望摆脱未定义的值,因此您最终不会得到一个充满未定义属性的对象。

在实例化对象并过滤掉未定义的值时,您当然可以非常小心。但是假设您想在构造函数中安装该过滤器,因为这样它就在一个地方。您希望构造函数忽略未定义的值,但不要在遇到它们时死亡。

对于访问器方法,您可以使用 around左右防止将属性设置为undef .但是那些method modifiers不为构造函数调用,只为访问器调用。 Moose 是否有类似的设施可以为 c'tor 实现相同的效果,即排除任何 undef属性不被接受?

注意驼鹿Any如果属性是 undef,type 将在对象中创建哈希键。我不想要,因为我想要 %$self不包含任何 undef值。

这是我做过的一些测试:

package Gurke;
use Moose;
use Data::Dumper;

has color => is => 'rw', isa => 'Str', default => 'green';
has length => is => 'rw', isa => 'Num';
has appeal => is => 'rw', isa => 'Any';

around color => sub {
# print STDERR Dumper \@_;
my $orig = shift;
my $self = shift;
return $self->$orig unless @_;
return unless defined $_[0];
return $self->$orig( @_ );
};

package main;
use Test::More;
use Test::Exception;

my $gu = Gurke->new;
isa_ok $gu, 'Gurke';
diag explain $gu;
ok ! exists $gu->{length}, 'attribute not passed, so not set';
diag q(attempt to set color to undef - we don't want it to succeed);
ok ! defined $gu->color( undef ), 'returns undef';
is $gu->color, 'green', 'value unchanged';
diag q(passing undef in the constructor will make it die);
dies_ok { Gurke->new( color => undef ) }
'around does not work for the constructor!';
lives_ok { $gu = Gurke->new( appeal => undef ) } 'anything goes';
diag explain $gu;
diag q(... but creates the undef hash key, which is not what I want);
done_testing;

最佳答案

这正是MooseX::UndefTolerant做。如果你让你的类不可变,它会比编写你自己的 BUILDARGS 方法快得多,因为代码被内联到生成的构造函数中。

关于perl - 使 Moose 构造函数忽略 undef 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5823685/

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