perl – 在“use fields”private中,实例变量在什么情况下声明为’_var’?

前端之家收集整理的这篇文章主要介绍了perl – 在“use fields”private中,实例变量在什么情况下声明为’_var’?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图理解字段pragma的行为,我找到 poorly documented,关于以下划线为前缀的字段.这就是文档中有关它的内容

Field names that start with an underscore character are made private to the class and are not visible to subclasses. Inherited fields can be overridden but will generate a warning if used together with the -w switch.

根据我的测试,这与其实际行为不一致.不仅_-前缀字段在子类中可见,它们在外部类中也是可见的(除非我没有得到“可见”的含义).此外,直接访问受限制的哈希工作正常.

在哪里可以找到更多关于字段pragma的行为,而不是源代码

{
    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');
}

解决方法

巧合的是,我碰巧在〜/ codescraps / fields / test.pl中有一个测试脚本,可以追溯到两年前,当时我尝试回答同样的问题.

猜你在找的Perl相关文章