北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

use fields によるPrivateなフィールド

use fields のperldocにはこう書いてます。

Field names that start with an underscore character are made private to
the class and are not visible to subclasses.


これでPrivateフィールドが作れる!? と思ったら、微妙に違います。

use strict;
use warnings;

{
    package MyBase;
    use fields qw(name _age);

    sub new{
	my $class = shift;
	my __PACKAGE__ $self = fields::new($class);

	$self->{name} = 'Mery';
	$self->{_age} = 22;

	return $self;
    }
}


{
    package MySub;
    use base qw(MyBase);
    use fields qw(height _weight);

    sub new{
	my  $class = shift;

	my __PACKAGE__ $self = $class->SUPER::new();
	$self->{height}  = 140;
	$self->{_weight} = 40;

	return $self;
    }
}


package main;
use Data::Dumper;

my MySub  $sub  = MySub::->new();
print "name    : ", $sub->{name}   , "\n";
print "height  : ", $sub->{height} , "\n";
print "_age    : ", $sub->{_age}   , "\n";
print "_weight : ", $sub->{_weight}, "\n";


こんなソースを書くと、$sub から_ageフィールドにアクセスする部分は、コンパイル時にエラーになってくれます。これは非常に嬉しい。


しかし、_weightにアクセスする部分はエラーとなりません。ここで言う Private と言うのは、あくまでもサブクラスからはアクセスできないってだけで、そのクラスのインスタンスからは、例えそのインスタンスの利用場所が違うpackage内であったとしても、普通にアクセスできてしまいます。