gpt4 book ai didi

perl - MooseX::Types 声明问题,严格的测试用例:)

转载 作者:行者123 更新时间:2023-12-01 11:58:23 27 4
gpt4 key购买 nike

经过令人尴尬的调试时间后,我终于剥离了 this issue归结为一个简单的测试用例。我会谦虚地请求一些帮助来理解它失败的原因。 :) 这是我收到的错误消息:

plxc16479> $h2/tmp/tmp18.pl
This method [new] requires a single argument. at /nfs/pdx/disks/nehalem.pde.077/perl/5.12.2/lib64/site_perl/MooseX/Types/TypeDecorator.pm line 91

MooseX::Types::TypeDecorator::new('MooseX::Types::TypeDecorator=HASH(0x655b90)') called at /nfs/pdx/disks/nehalem.pde.077/projects/lib/Program-Plist-Pl/lib/Program/Plist/Pl.pm line 10

Program::Plist::Pl::BUILD('Program::Plist::Pl=HASH(0x63d478)', 'HASH(0x63d220)') called at generated method (unknown origin) line 29

Program::Plist::Pl::new('Program::Plist::Pl') called at /nfs/pdx/disks/nehalem.pde.077/tmp/tmp18.pl line 10

包装器测试脚本:

use strict;
use warnings;

BEGIN {push(@INC, split(':', $ENV{PERL_TEST_LIBS}))};

use Program::Plist::Pl;

my $obj = Program::Plist::Pl->new();

程序::Plist::Pl 文件:

package Program::Plist::Pl;

use Moose;
use namespace::autoclean;

use Program::Types qw(Pattern); # <-- Removing this fixes error
use Program::Plist::Pl::Pattern;

sub BUILD {
my $pattern_obj = Program::Plist::Pl::Pattern->new();
}

__PACKAGE__->meta->make_immutable;

1;

程序::类型文件:

package Program::Types;

use MooseX::Types -declare => [qw(Pattern)];

class_type Pattern, {class => 'Program::Plist::Pl::Pattern'};

1;

Program::Plist::Pl::Pattern 文件:

package Program::Plist::Pl::Pattern;

use Moose;
use namespace::autoclean;

__PACKAGE__->meta->make_immutable;

1;

注意:虽然在上面的代码中我不需要 Program::Types 中的 Pattern 类型,但我在其他被剥离的代码中需要。我从中提取 INC 路径的 PERL_TEST_LIBS env var 仅包含项目模块的路径。没有从这些路径加载其他模块。

出现了 MooseX::Types Pattern 的定义导致了问题,但我不确定原因。文档显示了我正在使用的语法,但我可能滥用了 class_type,因为没有太多关于它的说法。目的是能够使用 Pattern 通过 MooseX::Params::Validate 进行类型检查验证参数是一个 Program::Plist::Pl::Program 对象。

我发现通过从 tmp18 直接调用 Pattern->new 来从等式中删除中间类 Program::Plist::Pl。 pl 包装器不会导致错误,即使导入了 Program::Types Pattern 类型也是如此。

最佳答案

当你说

package Program::Plist::Pl;
...
use Program::Types qw(Pattern);

您正在将名为 Pattern 的子例程导入包 Program::Plist::Pl 中。它的完全限定名称是 Program::Plist::Pl::Pattern。因此,

Program::Plist::Pl::Pattern->new();

解析为

Program::Plist::Pl::Pattern()->new();

代替

'Program::Plist::Pl::Pattern'->new();

这就是你的意思。如果你愿意,你可以用明确的引号来写它(它会起作用),但这是一个烦人的特例。另一种解决方案是将类型重命名为不会与包名称冲突的名称(比如 PatternObj)。

namespace::autoclean对此没有帮助。它可以防止人们将导入的子程序作为方法调用。但是您直接调用了 Program::Plist::Pl::Pattern(),然后在其返回值上调用了一个方法。

关于perl - MooseX::Types 声明问题,严格的测试用例:),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4652716/

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