Moose (Perl): преобразовать undef в пустую строку или 0, а не умереть ( )

Я получил много исключений от QA из-за неполных данных, передаваемых в мои конструкторы Moose. Имя атрибута присутствует в аргументах конструктора, но его значение равно undef .

Это факт из жизни многих приложений-сценариев, что вещи просто undef . И часто это прекрасно. Вам не нужно раздражающее предупреждение от прагмы warnings (поэтому вы делаете no warnings 'uninitialized' ), и вы, конечно же, не хотите, чтобы ваш код умер из-за одного маленького значения , скажем, номер дома - undef .

Итак, без лишних слов, я хочу, чтобы мои конструкторы Moose вели себя как обычный Perl (то есть без использования предупреждений «неинициализировано» ), то есть для преобразования undef в 0 или в пустую строку по мере необходимости. Попытка, показанная в этом примере, не работает для случая, когда имя атрибута присутствует, но имеет значение undef . Я мог бы подумать об использовании BUILDARGS для достижения того, что я хочу. Но существует ли декларативный способ в обычном Moose без обращения к MooseX :: UndefTolerant (который, к сожалению, я не могу использовать, поскольку он не установлен)?

package AAA;
use Moose;
has 'hu', is => 'ro', isa => 'Str';
has 'ba', is => 'ro', isa => 'Int';
no Moose; __PACKAGE__->meta->make_immutable;

package BBB;
use Moose; extends 'AAA';
has '+hu', default => ''; # don't want to die on undef
has '+ba', default => 0;  # idem
no Moose; __PACKAGE__->meta->make_immutable;

package main;
use Test::More;
use Test::Exception;
# Those AAAs should die ...
throws_ok { AAA->new( hu => undef ) }
    qr/Validation failed for 'Str' with value undef/;
throws_ok { AAA->new( ba => undef ) }
    qr/Validation failed for 'Int' with value undef/;
# .. but these BBBs should live:
lives_ok  { BBB->new( hu => undef ) } 'hu supplied as undef';
lives_ok  { BBB->new( ba => undef ) } 'ba supplied as undef';
done_testing;

8
задан Community 23 May 2017 в 12:22
поделиться