誰でも、重要性と perl で bless を使用する方法を説明できますか。bless でのスタック オーバーフローに関する多くのスレッドを読みましたが、明確ではありません。
3 に答える
これは、Perl がパッケージをオブジェクト指向クラスとして扱い、祝福されたオブジェクトをそれらのクラスのインスタンスとして扱うようにする方法です。
参照を bless すると、参照がマークされ、インタープリターがそれが関連付けられているパッケージを認識できるようになります。たとえば、次のように記述します。
$x = {}; bless $x, "somepackage";
その後、後で次のように記述できます。
$x->method(1, 2, 3);
そして、インタープリターはこれを次のように扱います。
somepackage::method($x, 1, 2, 3);
これは本当に簡単な例です。MyClass.pm というファイルにクラスを作成します。
package MyClass;
sub new {
my ($class_name) = @_;
my $new_instance = {};
bless $new_instance, $class_name;
return $new_instance;
}
sub set {
my ($self, $name, $value) = @_;
$self->{$name} = $value;
}
sub get {
my ($self, $name) = @_;
return $self->{$name};
}
これで、コードでクラスを使用できます。
import MyClass;
my $instance = MyClass->new; # Same as MyClass::new("MyClass")
$instance->set('age', 30); # Same as MyClass::set($instance, 'age', 30)
print $instance->get('age'); # Same as MyClass::get($instance, 'age')
アロー演算子は、 bless が参照をパッケージ名にバインドする方法と組み合わされて、優れたオブジェクト指向の構文を提供します。
perlobj のドキュメントの一番上に、例を示した役立つ説明があります。
オブジェクトは単なるデータ構造です
オブジェクト指向をサポートする他の多くの言語とは異なり、Perl はオブジェクトを構築するための特別な構文を提供しません。オブジェクトは、特定のクラスに明示的に関連付けられた単なる Perl データ構造 (ハッシュ、配列、スカラー、ファイルハンドルなど) です。
bless
その明示的な関連付けは、通常、クラスのコンストラクター サブルーチン内で使用される組み込み関数によって作成されます。以下は単純なコンストラクターです。
package File; sub new { my $class = shift; return bless {}, $class; }
名前
new
は特別なものではありません。コンストラクターに別の名前を付けることができます。package File; sub load { my $class = shift; return bless {}, $class; }
OO モジュールの最近の慣例では、コンストラクターの名前として常に new を使用しますが、そうする必要はありません。データ構造をクラスにブレスするサブルーチンは、Perl では有効なコンストラクターです。
前の例では、
{}
コードは空の匿名ハッシュへの参照を作成します。bless 関数はその参照を取得し、ハッシュを のクラスに関連付け$class
ます。最も単純なケースでは、$class
変数は string を含むことになります"File"
。変数を使用して、オブジェクトとして祝福されているデータ構造への参照を格納することもできます。
sub new { my $class = shift; my $self = {}; bless $self, $class; return $self; }
によって参照されるハッシュを bless したら
$self
、それに対してメソッドの呼び出しを開始できます。