以下の内容はhttps://hiratara.hatenadiary.jp/entry/20070516/1179317981より取得しました。


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内であったとしても、普通にアクセスできてしまいます。




以上の内容はhttps://hiratara.hatenadiary.jp/entry/20070516/1179317981より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14