[英]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.