我BUILD在MooseX :: Declare中的方法有困难.如果我说:
#!/usr/bin/perl
use MooseX::Declare;
class Foo {
has foo => (is => "rw", isa => "Str", default => "foo");
method BUILD {
print "I was called\n";
}
}
Foo->new;
Run Code Online (Sandbox Code Playgroud)
我得到以下不是有用的错误消息:
Reference found where even-sized list expected at /Users/cowens/perl5/lib/perl5/MooseX/Method/Signatures/Meta/Method.pm line 335.
Validation failed for 'MooseX::Types::Structured::Tuple[MooseX::Types::Structured::Tuple[Object],MooseX::Types::Structured::Dict[]]' failed with value [ [ Foo=HASH(0x804b20) ], { HASH(0x8049e0) => undef } ], Internal Validation Error is: Validation failed for 'MooseX::Types::Structured::Dict[]' failed with value { HASH(0x8049e0) => undef } at /Users/cowens/perl5/lib/perl5/MooseX/Method/Signatures/Meta/Method.pm line 365
MooseX::Method::Signatures::Meta::Method::validate('MooseX::Method::Signatures::Meta::Method=HASH(0xb8aab0)', 'ARRAY(0xb8ab30)') called at /Users/cowens/perl5/lib/perl5/MooseX/Method/Signatures/Meta/Method.pm line 139
Foo::BUILD('Foo=HASH(0x804b20)', 'HASH(0x8049e0)') called at generated method (unknown origin) line 25
Foo::new('Foo') called at test.pl line 13
Run Code Online (Sandbox Code Playgroud)
但如果我说:
#!/usr/bin/perl
use MooseX::Declare;
class Foo {
has foo => (is => "rw", isa => "Str", default => "foo");
sub BUILD {
my $self = shift;
print "I was called\n";
}
}
Foo->new;
Run Code Online (Sandbox Code Playgroud)
一切正常(但是丑陋且与其余代码不合适).
它失败了,因为BUILD需要一个arg方法签名.默认情况下,MooseX::Declare创建与BUILD调用方式不兼容的签名.(细节对我来说很模糊.)我知道因为我遇到过类似的错误一次.我当然同意错误信息可能更具启发性; 很多Moose的东西都是如此.
无论如何,我让它像这样工作:
use MooseX::Declare;
class Foo {
has foo => (is => "rw", isa => "Str", default => "foo");
method BUILD(Item $href) {
print "I was called\n";
}
}
Foo->new;
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
您可以摆弄签名并尝试更具体的类型; 我认为Moose发送了一个尚未完成的对象的hashref作为参数.
Axe*_*man -2
Perl 能够理解sub,因此会在当前包的符号表中创建一个条目。&Foo::BUILD,在Devel::Declare和其他魔法之后从类闭包创建了一个包范围。
Moose专门寻找BUILDsub 来允许您操纵构造函数逻辑。我的猜测(尽管我没有完全追踪)是 MooseX 模块不妨碍 Moose 尝试做的事情。这样本地人BUILD就永远传递给 Moose magic 来确定构造函数逻辑。
另一方面,method关键字更具有Devel::Declare魔力,可以在元类结构中创建方法。
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |