poorly documented이라는 fields
pragma의 동작을 이해하려고하는데 밑줄이있는 필드가 있습니다. 이 문서 그것에 대해 말을하는 것입니다 :어떤 상황에서 '필드 사용'에서 '_var'로 선언 된 인스턴스 변수가 비공개입니까?
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.
이 아래, 내 테스트에 따르면, 실제 동작과 일치하지 않습니다. 서브 클래스 내에서 _
-prefixed 필드를 볼 수있을뿐만 아니라 외국 클래스에서도 볼 수 있습니다 ('보이는'의미가없는 한). 또한, 제한된 해시에 직접 액세스하면 올바르게 작동합니다.
fields
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');
}
답장을 보내 주셔서 감사합니다. x86_64, debian 및 perl 5.10을 실행하고 있습니다. 내가 아는 한,'fields'는 전혀 사용되지 않습니다. 그러나, 5.9 이후, 구현은 제한된 해시를 선호하여 가상 해시 사용을 중단했습니다. 그리고 나는 Conways의 OO Perl을 가지고있다. 나는 '들판들'과 '기지들'에 대한 대안을 확실히 알고 있습니다. 내가 말했듯이, 나는 단지 pragma를 이해하기를 원하며, 문서는 부족하다. –
@ 페드로 : 예, 꽤 오랫동안 사용할 수 있지만 더 이상 지원되지는 않습니다. 나는 실제로'fields'에 대해서 다음과 같이 질문했다. http://stackoverflow.com/questions/1168644/why-is-the-fields-pragma-incompatible-with-multiple-inheritance-in-perl - - 그리고 같은 "사용 무스 대신"대답. :) – Ether