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;
}
我收到一条错误消息:"Can't use string ("PackageName") as hashref while strict refs in use.
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;
}
Method::Signatures 会自动将第一个参数移出参数列表,并为您将其放入 $self
。当你调用像 $obj->foo
这样的对象方法时,$self
就是 $obj
。但是当你调用像 Class->method
这样的 class 方法时,那么 $self
将是字符串 Class
。
您的 $self
包含字符串 PackageName
,因为您将 new
用作 class 方法,所以它应该如此。然后你使用 PackageName
作为 bless
的参数,但是 丢弃结果!
bless {}, $self;
这会将一个新的空 hashref({ }
)加到包含在 $self
中的包名中,然后丢弃结果。然后,当 $self
只是一个字符串时,您试图将其用作哈希引用,这会导致错误。所以试试这个:
method new($parent) {
my $obj = bless {}, $self;
$obj->{parent} = $parent;
return $obj;
}
我一直在做一个小项目,我决定尝试使用 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;
}
我收到一条错误消息:"Can't use string ("PackageName") as hashref while strict refs in use.
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;
}
Method::Signatures 会自动将第一个参数移出参数列表,并为您将其放入 $self
。当你调用像 $obj->foo
这样的对象方法时,$self
就是 $obj
。但是当你调用像 Class->method
这样的 class 方法时,那么 $self
将是字符串 Class
。
您的 $self
包含字符串 PackageName
,因为您将 new
用作 class 方法,所以它应该如此。然后你使用 PackageName
作为 bless
的参数,但是 丢弃结果!
bless {}, $self;
这会将一个新的空 hashref({ }
)加到包含在 $self
中的包名中,然后丢弃结果。然后,当 $self
只是一个字符串时,您试图将其用作哈希引用,这会导致错误。所以试试这个:
method new($parent) {
my $obj = bless {}, $self;
$obj->{parent} = $parent;
return $obj;
}