属性:はじめに

属性はかなり前にPerlに登場しました。 古くから重要なバージョンPerl 5.005には、かなり役に立たないプラグマattrs含まれていました。 このプラグマを使用すると、関数にいくつかの組み込み属性を掛けることができました。このため、この関数内の適切なパラメーターでuse attrsを指定use attrs必要がありました。 ただし、すでにPerl 5.6の2000年3月に、このプラグマは非推奨と宣言されました。 attributesモジュール、および変数/関数を宣言するための拡張構文に置き換えられました。 それらのカスタムラベルを作成し、これらのラベルのハンドラーを入力できるようになりました。 理由は不明ですが、属性の人気は上がっていません。 なんて残念。

ポイントに近い


今では、おそらく属性ではなくタグと呼ばれます。 すべてがシンプルに見えます-宣言された変数または関数にいくつかのラベルを追加できます。 いくつかの標準Perl属性がありますが、独自の属性を入力できます。 組み込みの属性は小文字で書かれているため、将来のオーバーレイや現在の警告を回避するために、カスタムラベルにこのようなレジスタを使用することはお勧めしません。

属性の構文は非常に簡単です。

my $myVar : myAttribute = 10;
sub mySub : myAttribute1 : myAttribute2 {:}


インタプリタは、コロンと属性名の間にスペースの存在に制限を課していません。個人的には、それらが一緒に書かれている場合、より視覚的に見えます。

属性は、関数と変数(スカラー、ハッシュ、配列)に掛けることができます。

それは何のためですか?


例を挙げます-CPANには、 Attribute::Utilという名前で結合されたモジュールのグループがあります。 実際のプロジェクトでそれらを使用する可能性についてはコメントしませんが、シンプルで明確な例として、これが必要です。

これらの最初のAttribute::Abstract 、抽象メソッドの古典的な記述の代わりを提供します。 同様の発表がある場合は注意してください:

sub myMethod { die "Abstract method called!"; }

彼が提案する構文ははるかに明確です。

sub myMethod: Abstract;

2番目のクラスAttribute::Memoizeを使用すると、同じ引数セットに対して一定の結果を返す関数にキャッシュを追加できます。 もちろん、 ifブロックで関数コードをラップすることは難しくありませんが、繰り返しますが、属性に:Memoize関数をマークすることができます。

3番目のクラスAttribute::Methodを使用すると、ほとんどすべてのメソッドの最初の行を記述する必要がなくなります。

my $self = shift;

メソッドに属性を設定するだけです:Method 、および$selfが単独で表示されます。 さらに、メソッドに渡す引数を指定することができます-そして、それらも初期化されます:

sub myMethod :Method($x) { print "self=$self, x=$x\n" }

面白い? 次に、モジュールのソースコードを調べることを忘れないでください。

UPD :記事の続き: 属性:内部の様子

Source: https://habr.com/ru/post/J53451/


All Articles