Perl-Can';不要调用新方法
我一直在做一个小项目,我决定尝试使用它,因为我发现它更整洁 这不需要使用Perl-Can';不要调用新方法,perl,oop,Perl,Oop,我一直在做一个小项目,我决定尝试使用它,因为我发现它更整洁 这不需要使用Method::Signatures,它可以工作,我可以使用package和call方法 sub new { my $self = {}; bless($self); shift; $self->{parent} = shift; return $self; } 但当我尝试这个时,它不起作用: method new($parent) { bless {}, $self;
Method::Signatures
,它可以工作,我可以使用package和call方法
sub new {
my $self = {};
bless($self);
shift;
$self->{parent} = shift;
return $self;
}
但当我尝试这个时,它不起作用:
method new($parent) {
bless {}, $self;
$self->{parent} = $parent;
return $self;
}
我得到一个错误:“不能在使用严格引用时将字符串(“PackageName”)用作hashref”
在这种情况下,new
方法中的$self
将显示包名。然后将一个空的匿名散列放入该包中,该包将为您提供实例化的对象
顺便说一句,您应该重新编写您的普通新方法:
sub new {
my $class = shift;
my $self = bless {} => $class;
$self->{parent} = shift;
return $self;
}
方法::签名会自动将第一个参数从参数列表中移出,并为您将其放入$self
。当你调用一个对象方法,比如$obj->foo
,那么$self
就是$obj
。但是当您调用一个类方法,比如class->method
,那么$self
将是字符串class
您的$self
包含字符串PackageName
,因为您正在使用new
作为类方法。然后使用PackageName
作为bless
的参数,但放弃结果
这将在$self
中包含的包名中添加一个新的空hashref(即{}
),然后丢弃结果。然后,您尝试将$self
用作hashref,而它只是一个字符串,这导致了错误。所以试试这个:
method new($parent) {
my $obj = bless {}, $self;
$obj->{parent} = $parent;
return $obj;
}
(即$self)使用方法new($class:$parent)
,使阅读更容易。我认为这是一个解释得很好的答案。我认为OP应该接受这个答案。解释得很好!谢谢:)
bless {}, $self;
method new($parent) {
my $obj = bless {}, $self;
$obj->{parent} = $parent;
return $obj;
}