加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:24:10 所属栏目:大数据 来源:网络整理
导读:我试图理解字段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 c
我试图理解字段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中有一个测试脚本,可以追溯到两年前,当时我尝试回答同样的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读