fields - クラスフィールドのコンパイル時決定

目次


名前

fields - クラスフィールドのコンパイル時決定


概要

    {
        package Foo;
        use fields qw(foo bar _Foo_private);
        sub new {
            my Foo $self = shift;
            unless (ref $self) {
                $self = fields::new($self);
                $self->{_Foo_private} = "this is Foo's secret";
            }
            $self->{foo} = 10;
            $self->{bar} = 20;
            return $self;
        }
    }

    my $var = Foo->new;
    $var->{foo} = 42;

    # this will generate an error
    # これはエラーとなります
    $var->{zap} = 42;

    # subclassing
    # サブクラス化
    {
        package Bar;
        use base 'Foo';
        use fields qw(baz _Bar_private);        # not shared with Foo
        sub new {
            my $class = shift;
            my $self = fields::new($class);
            $self->SUPER::new();                # init base fields
            $self->{baz} = 10;                  # init own fields
            $self->{_Bar_private} = "this is Bar's secret";
            return $self;
        }
    }

説明

fields プラグマはクラスフィールドのコンパイル時の検証を可能にします.

現在の実装では宣言されたフィールドを呼び出したパッケージの %FIELDS ハッシュに保持していますが, 今後変更される可能性があります. %FIELDS ハッシュを直接操作しないでください. これはコンパイル時に生成され, このプラグマによって管理されます.

5.9.0 より前の perl のみでの実装:

もしリファレンスを保持しているある型のレキシカル変数がハッシュ要素に アクセスし, その型と同じ名前のパッケージがこのプラグマを使って クラスフィールドを宣言しているのなら, その操作はコンパイル時に 配列操作へと変換されます.

関連する base プラグマは, 基底クラスのフィールドと fields プラグマを使って宣言されているフィールドを結合します. これはフィールドの継承を適切に機能させます.

アンダースコア文字から始まるフィールド名はプライベートなフィールドとされ, 派生クラスからは見えません. 継承されたフィールドはオーバーライドすることが できますが -w スイッチの環境下では警告を生成します.

5.9.0 より前の perl のみでの実装:

このプラグマによって名前付きフィールドを持つにもかかわらず 配列と同等に高速でコンパクトなオブジェクトを作ることができます. これはオブジェクトが適切な型の変数を通してアクセスされる時にのみ 機能します. もしオブジェクトが型を持っていなければアクセスは実行時にのみ 確認されます.

以下の関数がサポートされています.

new

5.9.0 より前の perl: fields::new() は fields プラグマを使って宣言されたフィールドを 指定したクラスに保持させた仮想ハッシュを生成しブレスします.

5.9.0 及びそれ以降の perl: fields::new() は fields プラグマを使って宣言されたフィールドを 指定したクラスに保持させた制限されたハッシュを生成しブレスします.

この機能は仮想ハッシュであってもそうでなくても便利です. これはフィールドベースのオブジェクトを生成する 推奨された方法です.

これはこのようなコンストラクタの記述を可能にします:

    package Critter::Sounds;
    use fields qw(cat dog bird);

    sub new {
        my $self = shift;
        $self = fields::new($self) unless ref $self;
        $self->{cat} = 'meow';                          # scalar element
        @$self{'dog','bird'} = ('bark','tweet');        # slice
        return $self;
    }
phash

perl 5.9.0 より前:

fields::phash() プレーンな(まだブレスされていない)仮想ハッシュを生成して 初期化するために使います. 仮想ハッシュを直接生成するよりは常にこれを 使うべきです.

1つ目の引数が配列へのリファレンスだったのならその配列に含まれるキーから 仮想ハッシュが生成されます. もし2つ目の引数が置かれていたらそれもまた 配列へのリファレンスでなければなりません. 今度の要素は値として使われます. もし2つ目の配列が1つ目の配列より少ない要素しかもっていなければ 残りに相当する仮想ハッシュの要素は初期化されません. これは特に関数の引数から仮想ハッシュを生成する時に役に立ちます.

    sub dogtag {
       my $tag = fields::phash([qw(name rank ser_num)], [@_]);
    }

fields::phash() は仮想ハッシュを構築するためのキー値ペアの リストも受け付けます. 例:

    my $tag = fields::phash(name => "Joe",
                            rank => "captain",
                            ser_num => 42);

    my $pseudohash = fields::phash(%args);

perl 5.9.0 及びそれ以降:

仮想ハッシュは 5.10 において 削除されます. 代わりに制限されたハッシュ 若しくは fields::new() を使うように考え直してください. fields::phash() はエラーとなるでしょう.


関連項目

base [CPAN]


和訳

 山科 氷魚 (YAMASHINA Hio) <hio@hio.jp>

原典: perl VERSION 5.9.5. 翻訳日: 2003-08-29 (perl-5.8.0, Class-Fields-0.16) (修正: 2007-08-03.)

fields - クラスフィールドのコンパイル時決定

索引

fields - クラスフィールドのコンパイル時決定