Ошибка Perl Moose :: Util :: TypeConstraints?что это за ошибка в имени есть недопустимые символы? - PullRequest
0 голосов
/ 10 июня 2010

Уже несколько часов я отслеживаю исключения Moose :: Util :: TypeConstraints, я не понимаю, где он проверяет тип, и говорит, что имя неверное.Я отследил ошибку в сокращенном примере, чтобы попытаться найти проблему, и она просто показывает мне, что я ее не получаю.

Получил ли я ошибку Moose :: Util :: TypeConstraints?

aoffice:new alex$ perl -c ../codesnippets/typeconstrainterror.pl 
../codesnippets/typeconstrainterror.pl syntax OK
aoffice:new alex$ perl -d ../codesnippets/typeconstrainterror.pl 
(...)
DB<1> r
Something::File::LocalFile=HASH(0x100d1bfa8) contains invalid characters for a type name. Names can contain alphanumeric character, ":", and "."
 at /opt/local/lib/perl5/vendor_perl/5.10.1/darwin-multi-2level/Moose/Util/TypeConstraints.pm line 508
    Moose::Util::TypeConstraints::_create_type_constraint('Something::File::LocalFile=HASH(0x100d1bfa8)', undef, undef, undef, undef) called at /opt/local/lib/perl5/vendor_perl/5.10.1/darwin-multi-2level/Moose/Util/TypeConstraints.pm line 285
    Moose::Util::TypeConstraints::type('Something::File::LocalFile=HASH(0x100d1bfa8)') called at ../codesnippets/typeconstrainterror.pl line 7
    Something::File::is_slink('Something::File::LocalFile=HASH(0x100d1bfa8)') called at ../codesnippets/typeconstrainterror.pl line 33
Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.  

Ниже код, который вылетает:

package Something::File;
use Moose;
has 'type' =>(is=>'ro', isa=>'Str', writer=>'_set_type' );

sub is_slink {
    my $self = shift;
    return ( $self->type eq 'slink' );
}

no Moose;
__PACKAGE__->meta->make_immutable;
1;


package Something::File::LocalFile;
use Moose;
use Moose::Util::TypeConstraints;

extends 'Something::File';

subtype 'PositiveInt'
     => as 'Int'
     => where { $_ >0 }
     => message { 'Only positive greater than zero integers accepted' };

no Moose;
__PACKAGE__->meta->make_immutable;
1;


my $a = Something::File::LocalFile->new;
# $a->_set_type('slink');
print $a->is_slink ." end\n"; 

Ответы [ 2 ]

4 голосов
/ 10 июня 2010

Повышение этого из комментария к ответу Хобба.

Происходит то, что имя вашего метода type, которое унаследовано в Something::File::LocalFile через extends 'Something::File';, конфликтует с функцией type, экспортируемой Moose::Util::TypeConstraints.

Я считаю, что если вы используете namespace::autoclean внутри Something::File::LocalFile, вы увидите, что эта проблема исчезнет.В качестве альтернативы, если вы ограничите экспорт из Moose::Util::TypeConstraints только теми функциями, которые вам нужны (например, use Moose::Util::TypeConstraints qw(subtype), проблема также исчезнет.

2 голосов
/ 10 июня 2010

Похоже, Moose::Util::TypeConstraints::type случайно импортируется в Something::File и перекрывает аксессор для вашего атрибута type.Так как метод TypeConstraints type ожидает получить имя типа в качестве первого аргумента, а не экземпляр Something::File, он выдает это странное сообщение об ошибке (после попытки привести в порядок ваш экземпляр).Я не уверен, как это произойдет с примером кода, который вы вставили, но обратная трассировка кажется довольно однозначной.Возможно, код, который вы запускаете, отличается от того, что вы вставили, или, может быть, я немного плотный в 3 часа ночи.

...