3

なぜPerlコンストラクターがこのすべての祝福を必要とするのか、そしてなぜそれが常にハッシュで行われるのか理解できません(明らかに他の変数タイプを使用することは可能です)。

クラスの新しいインスタンスを作成するときに、コンストラクターがハッシュへの祝福された参照を返すことはどのように意味がありますか?「リターン(これ)」がわかりました。またはそれらの線に沿った何かが、他の確率変数を返すことは私を不思議に思うだけです(特にあなたがハッシュを使用することになっているとき)。

my ?var = new Test("foo");
package Test;
our $localvar;
sub new{
 localvar = $_[1];
}

OK、それで私はこの基本的なクラスを持っています。クラス変数を初期化するときに設定し、後で$ var::localvarのように使用できます。しかし、これを実際にコンパイルしてPerlで動作させるには、「return bless {}、shift;」という行に追加する必要があります。

このハッシュは、そのクラスのインスタンスとして使用されているようで、メソッドはかなり静的です。ただし、クラス変数を使用することはできます。データオブジェクトを、そのオブジェクトを引数として取るメソッドのリストにリンクしているように見えます。しかし、すべてのチュートリアルで、それがすべて起こっているのであれば、常にハッシュを使用することを意味するのかどうかはわかりません。そして、なぜこのハッシュとクラスで宣言した「私たち」の両方を持っているのか混乱しています。それらは相互に排他的な概念のように見えますか?

4

2 に答える 2

16

データオブジェクトを、そのオブジェクトを引数として取るメソッドのリストにリンクしているように見えます。

そうです、まさにOOです。コンストラクターから返されるのはインスタンスです。言語が舞台裏で新しい「オブジェクトインスタンス」を作成し、コンストラクターがスロットの入力を担当する他のいくつかの言語とは異なり、Perlではコンストラクターメソッドがジョブ全体を実行します。{}オブジェクトのストレージとなる新しい匿名ハッシュへの参照を作成し、クラス名でタグ付けすることにより、bless実際にその参照をオブジェクトに変換します。

しかし、すべてのチュートリアルで、それがすべて起こっているのであれば、常にハッシュを使用することを意味するのかどうかはわかりません。

クラスはどのような種類の参照でもかまいませんが、ハッシュにはスロットという名前が付いているため、ハッシュ参照が最も便利で便利です。オブジェクトのプロパティを名前で参照できます。globrefオブジェクト(ファイルハンドルとソケット)、arrayrefオブジェクト(まれに、作成者が速度とメモリ使用量について非常に懸念している場合、フィールドが少ないオブジェクトに通常使用されます)、scalarrefオブジェクト(多くの場合、カプセル化に使用されます)の例があります。いくつかのCライブラリによって返されるポインタ)。ただし、hashrefオブジェクトは「標準」です。

クラス変数を初期化するときに設定し、後で?var::localvarのように使用できます。

しかし、なぜあなたはそうしますか?クラス変数はほとんど完全に役に立たないので、より基本的で便利なことを理解するまで、クラス変数を気にする必要はありません。

于 2013-02-16T04:16:26.840 に答える
9

クラスの新しいインスタンスを作成するときに、コンストラクターがハッシュへの祝福された参照を返すことは、どのように意味がありますか?

作成したオブジェクトを返さないと、かなり役に立たないコンストラクターになります。

「return (this);」は理解できました。またはそれらの線に沿った何か

では、混乱は何ですか?それはまさにあなたが返すべきものです。(慣習を除いて、それを呼び出すこと$selfです。)

sub new {
    my ($class, ...) = @_;
    my $self = bless({}, $class);  # Or: my $self = $class->SUPER::new(...);
    $self->{attribute1} = ...;
    $self->{attribute2} = ...;
    return $self;
}

このハッシュは、そのクラスのインスタンスとして使用されているようです。

祝福されたハッシュ、オブジェクトとも呼ばれるそのクラスのインスタンスです。


コメントからの質問

my $self = bless({}, $class);クラス インスタンスを参照するだけでなく、[do] を実行する必要があるのはなぜですか。お気に入り:$self = bless($class)

{}変数を割り当ててblessクラスに関連付けます。オブジェクトの作成に必要な 2 つのステップ。

2 つを分離することで、オブジェクトに異なる基本変数を使用するオプションが得られます。たとえば、IO::Socket::INET はハッシュの代わりにグロブを使用します。

しかし、私の意見では、誰もが作成するほとんどのオブジェクトはハッシュを使用しません。ハッシュはかなり特殊なデータ構造であり、コーディングの 99% では不要または役に立ちません。

ポイントは、ハッシュ テーブルを使用することではありません。連想配列を使用することです(各要素は属性です)。

連想配列 (ハッシュ テーブルなど) は、コーディングの 1% をはるかに超える部分で "必要かつ有用" です。

于 2013-02-16T04:30:05.953 に答える