Perl - 无法调用新方法

时间:2015-02-15 00:10:14

标签: perl oop

我一直在做一个小项目,我决定尝试使用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;
 }

我收到一条错误消息:“在使用严格的引用时,不能使用字符串(”PackageName“)作为hashref”。

2 个答案:

答案 0 :(得分:6)

方法::签名自动将第一个参数从参数列表中移出,并将其放在$self中。当您调用$obj->foo之类的对象方法时,$self只是$obj。但是当您调用类Class->method之类的类方法时,$self将是字符串Class

您的$self包含字符串PackageName,因为您使用new作为类方法。然后使用PackageName作为bless的参数,但会丢弃结果!

bless {}, $self;

这会将新的空hashref({ })保存到$self中包含的包名称中,然后将结果抛出。然后,当它只是一个字符串时,你试图使用$self作为hashref,这会导致错误。所以试试这个:

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

答案 1 :(得分:3)

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

在这种情况下,$self方法中的new将是包名称。然后,您将一个空的匿名哈希保存到该包中,该包为您提供实例化对象。

顺便说一句,您应该重新编写普通new方法:

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