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;
}