我试图了解fields
pragma 的行为,我发现它的记录很差,关于以下划线前缀的字段。这是文档必须说的:
以下划线字符开头的字段名称对类是私有的,对子类不可见。继承的字段可以被覆盖,但如果与 -w 开关一起使用会生成警告。
根据我在下面的测试,这与其实际行为不一致。- 前缀字段不仅_
在子类中可见,它们在外部类中也可见(除非我不明白“可见”的含义)。此外,直接访问受限哈希也可以正常工作。
除了查看源代码之外,我在哪里可以找到有关fields
编译指示行为的更多信息?
{
package Foo;
use strict;
use warnings;
use fields qw/a _b __c/;
sub new {
my ( $class ) = @_;
my Foo $self = fields::new($class);
$self->a = 1; $self->b = 2; $self->c = 3;
return $self;
}
sub a : lvalue { shift->{a} }
sub b : lvalue { shift->{_b} }
sub c : lvalue { shift->{__c} }
}
{
package Bar;
use base 'Foo';
use strict;
use warnings;
use Data::Dumper;
my $o = Bar->new;
print Dumper $o; ##$VAR1 = bless({'_b' => 2, '__c' => 3, 'a' => 1}, 'Foo');
$o->a = 4; $o->b = 5; $o->c = 6;
print Dumper $o; ##$VAR1 = bless({'_b' => 5, '__c' => 6, 'a' => 4}, 'Foo');
$o->{a} = 7; $o->{_b} = 8; $o->{__c} = 9;
print Dumper $o; ##$VAR1 = bless({'_b' => 8, '__c' => 9, 'a' => 7}, 'Foo');
}