我正在构建我的第一个Perl构造函数,我收到了这个错误。
Can't use string ("Managers::Toke::Interface") as a HASH ref while "strict refs" in use at
这是我的构造函数。
package Managers::Toke::Interface;
use strict;
use warnings;
use Core::ReturnValue;
use Data::Dumper;
## Toke stands for "The Online Kilobyte Extractor"
sub new {
my( $class, $username, $useruuid, $bytesSent, $bytesReceived, $bytePosition ) = @_ ;
my $self = {
'username'=> $username,
'useruuid'=> $useruuid,
'bytesSent'=> $bytesSent,
'bytesReceived' => $bytesReceived,
'bytePosition' => $bytePosition,
'date' => $date,
};
return bless $self, $class;
}
sub explain {
my $self = shift;
return sprintf "Hi, I'm %s", $self->{'username'};
}
以下是调用它的程序:
my $return = Managers::Toke::Interface->new($username,
$uuid,
$receivedBytesToKB,
$sentBytesToKB,
$bytePosition) or die "$!";
$return = Managers::Toke::Interface->explain();
我希望答案不明显,提前谢谢。
答案 0 :(得分:2)
我认为你误解了有关OOP如何运作的一些基本概念。
构造函数构造一个对象,然后返回它。您在构造函数中设置的所有时间属性都存储在对象中。 (您正在创建的类的实例。)但是您丢弃了您创建的对象并尝试在类本身上调用实例方法。
当您使用箭头(->
)运算符调用方法时,左侧的东西( invocant )将作为第一个参数传递给方法。这就是为什么你可以在构造函数中将它解压缩到$class
。
当你说
时Managers::Toke::Interface->explain();
这基本上等同于
Managers::Toke::Interface::explain( 'Managers::Toke::Interface' );
您将该字符串解压缩到$self
子中的explain
,然后尝试访问它,就像它是哈希引用一样。显然这不会起作用。当你调用一个实例方法时,你必须在对象实例上调用它,这通常是一个被祝福的hashref,而不是类。
my $object = Managers::Toke::Interface->new($username,
$uuid,
$receivedBytesToKB,
$sentBytesToKB,
$bytePosition) or die "$!";
$object->explain();
现在代码相当于
Managers::Toke::Interface::explain( $object );
其中$object
是您在new
中构建的内容,可以用作hashref,因为它是一个。
查看详细的Perl OO Tutorial了解更多信息,然后阅读Modern Perl中有关对象的章节。