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