Perl - 无法调用新方法

Perl - Can't Call new Method

我一直在做一个小项目,我决定尝试使用 Method::Signatures,因为我觉得它更整洁。

这没有使用 Method::Signatures 并且有效,我可以使用包和调用方法。

sub new {
    my $self = {};
    bless($self);
    shift;
    $self->{parent} = shift;
    return $self;
}

但是当我尝试这个时,它不起作用:

 method new($parent) {
   bless {}, $self;
   $self->{parent} = $parent;
   return $self;
 }

我收到一条错误消息:"Can't use string ("PackageName") as hashref while strict refs in use.

method new($parent) {
   my $instance = bless {} => $self;
   $instance->{parent} = $parent;
   return $instance;
 }

在这种情况下,您的 new 方法中的 $self 将是程序包名称。然后你将一个空的匿名散列加到那个包中,它给你实例化的对象。

顺便说一句,你应该重写你的普通 new 方法:

sub new {
    my $class = shift;
    my $self = bless {} => $class;
    $self->{parent} = shift;
    return $self;
}

Method::Signatures 会自动将第一个参数移出参数列表,并为您将其放入 $self。当你调用像 $obj->foo 这样的对象方法时,$self 就是 $obj。但是当你调用像 Class->method 这样的 class 方法时,那么 $self 将是字符串 Class

您的 $self 包含字符串 PackageName,因为您将 new 用作 class 方法,所以它应该如此。然后你使用 PackageName 作为 bless 的参数,但是 丢弃结果!

bless {}, $self;

这会将一个新的空 hashref({ })加到包含在 $self 中的包名中,然后丢弃结果。然后,当 $self 只是一个字符串时,您试图将其用作哈希引用,这会导致错误。所以试试这个:

method new($parent) {
   my $obj = bless {}, $self;
   $obj->{parent} = $parent;
   return $obj;
}