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 Foo $var = Foo->new;
    $var->{foo} = 42;

    # this will generate a compile-time 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 ハッシュを直接操作しないでください. これはコンパイル時に生成され, このプラグマによって管理されます.

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

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

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

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

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

new

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

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

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

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

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);

関連項目

base [CPAN], "Pseudo-hashes: Using an array as a hash" in perlref [CPAN]


和訳

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

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

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

索引

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