Perl - 无法调用新方法

use*_*169 2 oop perl

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

这是没有使用Method::Signatures它工作,我能够使用包和调用方法.

sub new {
    my $self = {};
    bless($self);
    shift;
    $self->{parent} = shift;
    return $self;
}
Run Code Online (Sandbox Code Playgroud)

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

 method new($parent) {
   bless {}, $self;
   $self->{parent} = $parent;
   return $self;
 }
Run Code Online (Sandbox Code Playgroud)

我得到一个错误说:"当使用严格的引用时,不能使用字符串("PackageName")作为hashref".

fri*_*edo 6

方法::签名自动将第一个参数移出参数列表并将其放入$self.当你调用一个像对象的方法时$obj->foo,那$self就是$obj.但是当你调用类方法时Class->method,那$self将是字符串Class.

$self包含字符串PackageName,因为它应该new用作类方法.然后你PackageName用作参数bless,但扔掉结果!

bless {}, $self;
Run Code Online (Sandbox Code Playgroud)

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

method new($parent) {
   my $obj = bless {}, $self;
   $obj->{parent} = $parent;
   return $obj;
}
Run Code Online (Sandbox Code Playgroud)

  • [您可以使用`method new($ class:$ parent)`更改调用者的变量名称(https://metacpan.org/pod/Method::Signatures#Invocant-parameter)(即$ self),使阅读更容易. (4认同)