0

我正在构建我的第一个 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();

我希望答案不明显,在此先感谢。

4

1 回答 1

2

我认为您误解了有关 OOP 如何工作的一些基本概念。

您的构造函数构造一个对象,然后返回它。您在构造函数中花费所有时间设置的属性存储在对象中。(您正在创建的类的实例。)但是您丢弃了您创建的对象并尝试在类本身上调用实例方法。

当您使用箭头 ( ->) 运算符调用方法时,左侧的东西(调用者)作为第一个参数传递给方法。这就是为什么您可以将其解压缩到$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 教程以获取更多信息,然后阅读有关Modern Perl中的对象的章节。

于 2013-10-09T21:09:00.520 回答