繁体   English   中英

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

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

方法::签名自动将第一个参数从参数列表中移出并将其放入$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;
}
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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM