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 の仕組みに関するいくつかの基本的な概念を誤解していると思います。

コンストラクターはオブジェクトを構築し、それを返します。コンストラクターで設定するのにすべての時間を費やした属性は、オブジェクトに格納されます。(作成しているクラスのインスタンス。) しかし、作成したオブジェクトを破棄し、クラス自体でインスタンス メソッドを呼び出そうとします。

アロー ( ->) 演算子を使用してメソッドを呼び出すと、左側のもの ( invocant ) が最初のパラメーターとしてメソッドに渡されます。$classそのため、コンストラクターで展開できます。

あなたが言う時

Managers::Toke::Interface->explain();

それは基本的に同等です

Managers::Toke::Interface::explain( 'Managers::Toke::Interface' );

その文字列を$selfサブexplainに展開し、ハッシュ参照のようにアクセスしようとします。明らかにそれはうまくいきません。インスタンスメソッドを呼び出すときは、オブジェクトインスタンスで呼び出す必要があります。これは通常、クラスではなく、bless されたハッシュリファレンスです。

my $object = Managers::Toke::Interface->new($username,
                               $uuid,
                               $receivedBytesToKB,
                               $sentBytesToKB,
                               $bytePosition) or die "$!";

$object->explain();

コードは次と同等です

Managers::Toke::Interface::explain( $object );

where$objectは で構築したものでnew、ハッシュリファレンスとして使用できます。これは 1 つであるためです。

詳細については、Perl OO チュートリアルを参照してください。次に、 Modern Perlのオブジェクトに関する章をお読みください。

于 2013-10-09T21:09:00.520 に答える