***************************************************** * GENERATED FILE, DO NOT EDIT * * THIS IS NO SOURCE FILE, BUT RESULT OF COMPILATION * ***************************************************** This file was generated by po4a(7). Do not store it (in VCS, for example), but store the PO file used as source file by po4a-translate. In fact, consider this as a binary, and the PO file as a regular .c file: If the PO get lost, keeping this translation up-to-date will be harder. =encoding UTF-8 =pod =head1 NAME Moose::Manual::Attributes - Moose 对象的属性 =head1 VERSION version 2.0401 =head1 ä»‹ç» Moose ä¸æœ€å¼ºå¤§ä¹Ÿæœ€çµæ´»çš„功能莫过于对象的属性。通过简å•çš„声明属性便å¯ä»¥æž„é€ ä¸€ä¸ªåŠŸèƒ½å¼ºå¤§çš„ç±»ã€‚ 类的æ¯ä¸€ä¸ªæˆå‘˜éƒ½æ˜¯ä¸€ä¸ªå±žæ€§ã€‚比如,C<Person> 类有 first name å’Œ last name。属性对于类是å¯é€‰çš„,好比并ä¸æ˜¯æ¯ä¸€ä¸ª C<Person> 类都有社ä¿å·ã€‚ 我们å¯ä»¥æŠŠç±»å±žæ€§å½“作是æˆå‘˜çš„åå—,通过这个åå—我们å¯ä»¥è¯»å–或设置该æˆå‘˜çš„值。当然,属性还å¯ä»¥åŒ…括默认值ã€ç±»åž‹çº¦æŸã€å§”托方法ç‰ç‰ã€‚ 在其他è¯è¨€ä¸ï¼Œå±žæ€§ä¹Ÿè¢«ç§°ä¸º slots 或 properties。 =head1 属性设置 通过 C<has> æ¥å£°æ˜Žä¸€ä¸ªå±žæ€§ï¼š package Person; use Moose; has 'first_name' => ( is => 'rw' ); è¿™æ ·å°±å£°æ˜Žäº†æœ‰ä¸€ä¸ªå¯è¯»å†™çš„属性的类 C<Person>。 =head2 读写 vs åªè¯» 通过 C<has> ä¼ é€’çš„é€‰é¡¹å¯ä»¥å¯¹å±žæ€§è¿›è¡Œç›¸å…³è®¾ç½®ã€‚ä¸è¿‡æœ€ç®€å•ä¹Ÿæ˜¯æœ€åŸºæœ¬çš„æ˜¯ï¼Œä½ å¯ä»¥é€šè¿‡ C<is> æ¥è®¾ç½®å˜é‡çš„读å–æƒé™ï¼Œread-only(ro) 或者 read-write(rw)。当设置为rw æ—¶ï¼Œä½ å¯ä»¥é€šè¿‡è®¿é—®å™¨æ¥ä¿®æ”¹å®ƒçš„值。但设置为 roæ—¶ï¼Œä½ ä¾¿åªèƒ½è¯»å–该属性的值。 äº‹å®žä¸Šï¼Œä½ å¯ä»¥ä¸è®¾ç½® C<is>,Moose 会默认使该属性没有任何å˜å–æƒé™ã€‚这对æŸäº›å±žæ€§æ¯”较管用,如å¥æŸ„ç‰ã€‚但是 Moose 会抛出è¦å‘Šä»¥é˜²æ¢ç¨‹åºå‘˜å¿˜è®°ä¹¦å†™å˜å–è§„åˆ™ã€‚å¦‚æžœä½ ç¡®å®žéœ€è¦è¿™ä¹ˆåšï¼Œé‚£ä¹ˆå¯ä»¥é€šè¿‡è®¾ç½® C<is> 为 C<bare> æ¥é˜²æ¢äº§ç”Ÿè¦å‘Šã€‚ =head2 å˜å–方法 æ¯ä¸ªå±žæ€§æœ‰ä¸€ä¸ªæˆ–多个å˜å–方法,通过å˜å–æ–¹æ³•ï¼Œä½ å¯ä»¥è¯»å–或者设置该属性的值 默认的å˜å–方法和属性的åå—ä¸€æ ·ã€‚å¦‚æžœå±žæ€§å˜å–æƒé™è®¾ç½®ä¸º rw,则å¯ä»¥é€šè¿‡å˜å–方法æ¥è¯»å†™å±žæ€§å€¼ï¼Œå之,则ä¸å¯ä»¥ã€‚ 以上é¢çš„ C<Person> 类为例,我们有一个å˜å–方法为 C<first_name>,通过这个å˜å–方法我们å¯ä»¥è¯»å–或设置 C<Person> 实例的 C<first_name> 属性。 å¦‚æžœä½ æ„¿æ„çš„è¯ï¼Œä½ 也å¯ä»¥æŒ‡å®šå…·ä½“的方法æ¥è¿›è¡Œå˜å–æ“ä½œã€‚è¿™å¯¹äºŽä½ æƒ³è¦è®¾ç½®ä¸€ä¸ªé»˜è®¤å˜å–æƒé™ä¸º ro,但是å¯ä»¥é€šè¿‡æŸç§æ–¹æ³•æ¥ä¿®æ”¹å±žæ€§æ˜¯éžå¸¸æ–¹ä¾¿çš„。 has 'weight' => ( is => 'ro', writer => '_set_weight', ); 这在以下场景ä¸æ˜¯éžå¸¸æ–¹ä¾¿çš„。比如,æ¯å½“我们调用 C<eat> 方法的时候,我们å¯èƒ½ä¼šæ”¹å˜ weight,而在其他场景ä¸æˆ‘们对 weight åªæœ‰è¯»å–æƒé™ã€‚ 有些人喜欢把读å–和设置方法分别æ¥å£°æ˜Žã€‚在 I<Perl Best Practices> ä¸ï¼ŒDamian Conway也推è读者使用"get_"å’Œ"set_"类方法。 我们å¯ä»¥é€šè¿‡å…·ä½“的声明æ¥åšåˆ°ã€‚ has 'weight' => ( is => 'rw', reader => 'get_weight', writer => 'set_weight', ); ä½ è®¤ä¸ºè¿™æ ·ä¸€éåˆä¸€ééžå¸¸ç¹çï¼Ÿä½ è¯´çš„å¯¹ï¼Œä¸è¿‡å¹¸è¿çš„是,Moose æ供了相当强大的拓展系统,å¯ä»¥è®©ä½ 覆盖默认的命å约定。有关详细信æ¯ï¼Œè¯·å‚阅 L<Moose::Manual::MooseX>。 =head2 æ–言和清ç†æ–¹æ³• Moose å…è®¸ä½ ä½¿ç”¨æ–言æ¥åˆ¤æ–一个属性是å¦å·²ç»è¢«å®šä¹‰ã€‚ æ–言方法å¯ä»¥å‘Šè¯‰ä½ 当å‰å±žæ€§æ˜¯å¦è¢«å®šä¹‰ã€‚ä¸è¿‡éœ€è¦æ³¨æ„的是,当属性被设置为 C<undef>或者其他的一些å‡å€¼ï¼Œæ–言ä¾ç„¶ä¼šè¿”回 true。 清ç†æ–¹æ³•ä¼šå–消设置属性。这和设置属性为 C<undef> 是 I<ä¸åŒçš„>。清ç†å‡½æ•°æ˜¯ä¸ºäº†è®©ä½ 更方便的使用æ–言。 这里有一个例å用æ¥è®²è§£æ–言和清ç†æ–¹æ³•ã€‚ package Person; use Moose; has 'ssn' => ( is => 'rw', clearer => 'clear_ssn', predicate => 'has_ssn', ); ... my $person = Person->new(); $person->has_ssn; # false $person->ssn(undef); $person->ssn; # returns undef $person->has_ssn; # true $person->clear_ssn; $person->ssn; # returns undef $person->has_ssn; # false $person->ssn('123-45-6789'); $person->ssn; # returns '123-45-6789' $person->has_ssn; # true my $person2 = Person->new( ssn => '111-22-3333'); $person2->has_ssn; # true 默认情况下,Moose ä¸ä¸ºä½ æä¾›æ–言和清ç†æ–¹æ³•ã€‚å½“ä½ å…·ä½“æŒ‡æ˜Žæ—¶ï¼ŒMoose ä¼šä¸ºä½ æ供的。 =head2 必需? 默认情况下,所有的属性都是å¯é€‰çš„,ä¸éœ€è¦åœ¨æž„é€ å¯¹è±¡çš„æ—¶å€™å°±æ˜Žç¡®ç»™å‡ºã€‚å¦‚æžœä½ æƒ³æŒ‡æ˜ŽæŸä¸ªå±žæ€§æ˜¯å¿…é¡»çš„ï¼Œä½ å¯ä»¥æŠŠ C<required> 属性设置为 true。 has 'name' => ( is => 'ro', required => 1, 值得一æ的是,什么时候æ‰æ˜¯"required"。 基本上,当这个属性å必须被æä¾›ç»™æž„é€ å‡½æ•°ï¼Œæˆ–è€…é€šè¿‡ defaultã€builderæ¥è®¾ç½®ï¼Œè¿™ç§æƒ…况下是 required。 å¦‚æžœä½ åœ¨ä¸€ä¸ªå¿…é¡»å±žæ€§ä¸Šå®šä¹‰äº†æ¸…ç†æ–¹æ³•ï¼Œè¿™ä¸ªæ¸…ç†æ–¹æ³•æ˜¯I<å¯ä»¥>è¿è¡Œçš„,也就是说一个必须属性也是å¯ä»¥è¢«å–消设置的。 ä½†æ˜¯è¿™æ ·åšå¤§å¤šæ˜¯æ²¡æœ‰æ„义的,所以我们并ä¸æŽ¨è这么åšã€‚ =head2 é»˜è®¤å€¼å’Œæž„é€ æ–¹æ³• 属性å¯ä»¥è®¾ç½®é»˜è®¤å€¼ï¼Œè€Œä¸” Moose æ供了两ç§æ–¹æ³•æ¥è®¾ç½®é»˜è®¤å€¼ã€‚ 最简å•çš„ï¼Œä½ å¯ä»¥é€šè¿‡ C<default> æ¥è®¾ç½®ã€‚ has 'size' => ( is => 'ro', default => 'medium', predicate => 'has_size', ); 如果 size 属性没有æä¾›ç»™æž„é€ å‡½æ•°ï¼Œé‚£ä¹ˆ size 属性会被设置为默认值 C<medium>: my $person = Person->new(); $person->size; # medium $person->has_size; # true ä½ ä¹Ÿå¯ä»¥é€šè¿‡æ供一个å函数æ¥æ供默认值。 has 'size' => ( is => 'ro', default => sub { ( 'small', 'medium', 'large' )[ int( rand 3 ) ] }, predicate => 'has_size', ); 这是一个简å•çš„例å。æ¯æ¬¡åˆå§‹åŒ–构建默认值的时候,å函数便会被调用。 å½“ä½ æä¾›å函数引用时,Moose 会调用它,并且ä¸ä¼ 递任何å‚数进去。 has 'size' => ( is => 'ro', default => sub { my $self = shift; return $self->height > 200 ? 'large' : 'average'; }, ); C<default> æ˜¯åœ¨æž„é€ å‡½æ•°ä¸å¼€å§‹è¿è¡Œçš„,所以会比一些属性更先è¿è¡Œã€‚但当 C<default>ä¾èµ–其他属性时就会出现一些问题。ä¸è¿‡ä½ å¯ä»¥é€šè¿‡è®¾ç½®å±žæ€§ä¸º C<lazy> æ¥è§£å†³ã€‚这个会在之åŽè®²åˆ°ã€‚ å¦‚æžœä½ æƒ³åœ¨ default ä¸ä½¿ç”¨å¼•ç”¨çš„è¯ï¼Œè¿™ä¸ªå¼•ç”¨å¿…须在å函数ä¸è¿”回。 has 'mapping' => ( is => 'ro', default => sub { {} }, ); 这是必è¦çš„。å¦åˆ™ Perl 会实例化一次,然åŽè¯¥å¼•ç”¨åœ¨å„个实例ä¸è¢«å…±äº«ã€‚下é¢è¿™ä¸ªæ˜¯é”™è¯¯çš„。 has 'mapping' => ( is => 'ro', default => {}, # wrong! ); å¦‚æžœä½ èµ‹ç»™ default 一个éžå函数返回的引用时,Moose 会抛出一个错误。 If Moose allowed this then the default mapping attribute could easily end up shared across many objects. Instead, wrap it in a subroutine reference as we saw above. 这有一点å¤æ€ªï¼Œä¸è¿‡è¯·åŽŸè°…,Perl æœ‰æ—¶å€™å°±æ˜¯è¿™æ ·ã€‚ ä½ å¯ä»¥é€šè¿‡ C<builder> 方法æ¥é¿å¼€è¿™ä¸€å¤æ€ªçš„现象。 has 'size' => ( is => 'ro', builder => '_build_size', predicate => 'has_size', ); sub _build_size { return ( 'small', 'medium', 'large' )[ int( rand 3 ) ]; } è¿™ä¸ªä½¿ç”¨æœ‰ä»¥ä¸‹å‡ ä¸ªå¥½å¤„ã€‚æŠŠå¯¹å±žæ€§çš„æ“作移到一个代ç å—ä¸ï¼Œæ–¹ä¾¿é˜…è¯»ä¸Žç»„ç»‡ã€‚è¿™æ ·å使用的è¯ï¼Œä¹Ÿæ–¹ä¾¿åç±»é‡è½½æˆ–者由一个 role æ¥å®žçŽ°ã€‚ æˆ‘ä»¬å¼ºçƒˆå»ºè®®ä½ ä½¿ç”¨ C<builder> æ¥åˆå§‹åŒ–属性。它就是 C<default> 的增强版。 C<builder> å’Œ C<default> 作为类方法调用的,ä¸æŽ¥å—é¢å¤–çš„å‚数。 =head3 Builders 覆写 C<builder> 是通过åå—æ¥æŒ‡å®šåˆå§‹åŒ–函数的。所以 builder 方法是å¯ä»¥è¢«ç»§æ‰¿å’Œé‡è½½çš„。 比如我们继承 C<Person> 类,我们便å¯ä»¥é‡è½½ C<_build_size>: package Lilliputian; use Moose; extends 'Person'; sub _build_size { return 'small' } =head3 Builders 与 roles é…åˆå·¥ä½œ åŒæ ·ï¼Œbuilders å¯ä»¥ä¸Ž roles 完美的é…åˆã€‚比如,一个角色å¯ä»¥ä¸ºä¸€ä¸ªç±»æä¾› builder方法。 package HasSize; use Moose::Role; requires '_build_size'; has 'size' => ( is => 'ro', lazy => 1, builder => '_build_size', ); package Lilliputian; use Moose; with 'HasSize'; sub _build_size { return 'small' } 关于 Roles 的更多信æ¯å¯ä»¥æŸ¥é˜… L<Moose::Manual::Roles>。 =head2 Laziness Moose å…è®¸ä½ é€šè¿‡ C<lazy> æ¥æŽ¨è¿Ÿå±žæ€§å®šä¹‰ã€‚ has 'size' => ( is => 'ro', lazy => 1, builder => '_build_size', ); 当æŸå±žæ€§ C<lazy> 为 true 时,该属性的 default 并ä¸ä¼šåœ¨æž„é€ å®žä¾‹æ—¶è¿è¡Œï¼Œè€Œæ˜¯åœ¨ç›¸åº”的访问器访问时æ‰è¿›è¡Œè®¡ç®—。为什么è¦è¿™æ ·åšå‘¢ï¼Ÿ 首先,如果该属性的 default 值ä¾èµ–于其他属性,那么该属性的 C<lazy> I<å¿…é¡»>为 true。 有一些情况下是ä¸éœ€è¦åœ¨è¯¥å±žæ€§è¢«è¯·æ±‚å‰è¿›è¡Œè®¡ç®—的。通过设置该属性为 C<lazy>ï¼Œä½ å¯ä»¥æœ‰æ•ˆçš„节çœä½ çš„ CPU 时间。 æˆ‘ä»¬å»ºè®®ä½ ä½¿ç”¨ builder 或者 lazy default。 =head2 æž„é€ å‡½æ•°çš„å‚数(C<init_arg>) 默认情况下,æ¯ä¸ªå±žæ€§éƒ½å¯ä»¥é€šè¿‡åå—ä¼ é€’ç»™ç±»ã€‚æœ‰æ—¶ï¼Œä½ å¯èƒ½éœ€è¦ç”¨ä¸€ä¸ªç•¥æœ‰ä¸åŒçš„åå—ï¼Œæˆ–è€…ä½ ä¸æƒ³ä¼ 递任何å‚数进去。 ä½ å¯ä»¥é€šè¿‡ C<init_arg> 选项æ¥åšåˆ°ä»¥ä¸Šçš„事情。 has 'bigness' => ( is => 'ro', init_arg => 'size', ); 现在我们有一个"bigness"属性,但是我们通过 C<size> æ¥ä¼ é€’åˆ°æž„é€ å‡½æ•°ä¸ã€‚ ä½ ä¹Ÿå¯ä»¥é€šè¿‡å¦‚下方å¼è®¾ç½®ä¸æŽ¥å—任何å‚数。 has '_genetic_code' => ( is => 'ro', lazy => 1, builder => '_build_genetic_code', init_arg => undef, ); By setting the C<init_arg> to C<undef>, we make it impossible to set this attribute when creating a new object. =head2 循环引用 Moose å†…ç½®æ˜¯æ”¯æŒ weak reference 的,å¯ä»¥é€šè¿‡è®¾ç½® C<weak_ref> 为 true æ¥å®žçŽ°ã€‚ has 'parent' => ( is => 'rw', weak_ref => 1, ); $node->parent($parent_node); è¿™å¯¹ä½ æž„å»ºä¸€ä¸ªåŒ…å«å¾ªçŽ¯å¼•ç”¨çš„类是éžå¸¸æœ‰ç”¨çš„。 When the object in a weak references goes out of scope, the attribute's value will become C<undef> "behind the scenes". This is done by the Perl interpreter directly, so Moose does not see this change. This means that triggers don't fire, coercions aren't applied, etc. 该属性并没有被清楚,所以在调用æ–言方法时,ä»ç„¶è¿”回 true。(这里有点å«ç³Šä¸æ¸…,具体的请è§åŽŸæ–‡æ¡£ï¼‰ =head2 触å‘器 C<trigger> 将在属性被设置的时候自动被调用。 has 'size' => ( is => 'rw', trigger => \&_size_set, ); sub _size_set { my ( $self, $size, $old_size ) = @_; my $msg = $self->name; if ( @_ > 2 ) { $msg .= " - old size was $old_size"; } $msg .= " -size is now $size"; warn $msg; } 当属性被设置之åŽï¼Œè§¦å‘器将会被调用。Moose ä¼šä¼ é€’æ–°å€¼ã€æ—§å€¼è¿›åŽ»ï¼Œå½“没有旧值时,旧值å‚数为 C<undef>。 这个与 C<after> 方法修饰符是有区别的。触å‘器åªåœ¨å±žæ€§è¢«è®¾ç½®æ—¶è¢«è°ƒç”¨ï¼Œè€Œä¸æ˜¯æ¯å½“访问器访问时触å‘。触å‘å™¨ä¹Ÿä¼šåœ¨æž„é€ å‡½æ•°è¿è¡Œæ—¶è¢«è°ƒç”¨ã€‚而 C<after> 方法修饰符ä¸æ˜¯ã€‚ 注æ„,触å‘器ä¸åœ¨ C<default> 或 C<builder> 之åŽè¢«è°ƒç”¨ã€‚ =head2 属性类型 属性类型å¯ä»¥é™åˆ¶åªæŽ¥å—æŸäº›ç±»åž‹çš„值: has 'first_name' => ( is => 'ro', isa => 'Str', ); 这表明 C<first_name> 属性是å—符串类型。 Moose 还æ供了一个快æ·çš„方法æ¥æŒ‡å®šä¸€ä¸ªå±žæ€§çš„类型,就是通过一个 role æ¥å®žçŽ°çš„。 has 'weapon' => ( is => 'rw', does => 'MyApp::Weapon', ); 关于属性类型的信æ¯å…·ä½“请查阅 L<Moose::Manual::Types>。 =head2 委托属性 Moose å¯ä»¥å®šä¹‰å§”托属性æ¥æ“作属性值。 has 'hair_color' => ( is => 'ro', isa => 'Graphics::Color::RGB', handles => { hair_color_hex => 'as_hex_string' }, ); 当调用 C<hair_color_hex> 时,会实际上调用 C<<$self->hair_color->as_hex_string>>。 关于委托属性的更多信æ¯è¯·æŸ¥é˜… L<Moose::Manual::Delegation>。 =head2 属性特å¾å’Œå…ƒç±» Moose 最好的特点就是å¯ä»¥é€šè¿‡ traits å’Œ 元类æ¥å®žçŽ°è‡ªçœã€‚ ä½ å¯ä»¥æ供一个或多个 traits æ¥æ述一个属性: use MooseX::MetaDescription; has 'size' => ( is => 'ro', traits => ['MooseX::MetaDescription::Meta::Trait'], description => { html_widget => 'text_input', serialize_as => 'element', }, ); ä½ å¯ä»¥å¾ˆæ–¹ä¾¿çš„使用一个或多个 traits。 关于属性特å¾å’Œå…ƒç±»çš„许多模å—都å¯ä»¥åœ¨ CPAN ä¸Šæ‰¾åˆ°ã€‚ä½ å¯ä»¥åœ¨L<Moose::Manual::MooseX> ä¸æ‰¾åˆ°ä¸€äº›ç¤ºä¾‹ã€‚关于"元类"å’Œ"继承"的更多信æ¯è¯·æŸ¥é˜… L<Moose::Cookbook>。 =head2 定义自己的委托属性 Native delegations å…è®¸ä½ å®šä¹‰ Perl çš„æ•°æ®ç»“构。 比如,我们å¯ä»¥åˆ›å»ºå…³äºŽæ•°ç»„引用的 C<push()>,C<shift()>,C<map()>,C<count()>ç‰æ–¹æ³•ã€‚ has 'options' => ( traits => ['Array'], is => 'ro', isa => 'ArrayRef[Str]', default => sub { [] }, handles => { all_options => 'elements', add_option => 'push', map_option => 'map', option_count => 'count', sorted_options => 'sort', }, ); 更多信æ¯è¯·æŸ¥é˜… L<Moose::Manual::Delegation>。 =head1 属性继承 默认情况下,åç±»å¯ä»¥ç»§æ‰¿çˆ¶ç±»ä¸æ‰€æœ‰çš„å±žæ€§ã€‚ä½ ä¹Ÿå¯ä»¥åœ¨åç±»ä¸é‡è½½å®ƒä»¬ã€‚ 继承一个属性,åªéœ€è¦ç®€å•çš„在å‰é¢åŠ (C<+>): package LazyPerson; use Moose; extends 'Person'; has '+first_name' => ( lazy => 1, default => 'Bill', ); 现在åç±»ä¸çš„ C<first_name> 属性是 lazy 的,而且默认值为 C<'Bill'>。 æˆ‘ä»¬å»ºè®®ä½ åœ¨ä¸æ˜¯å¾ˆäº†è§£çš„时候ä¸è¦éšä¾¿ä½¿ç”¨ï¼Œå°¤å…¶æ˜¯æ¶‰åŠåˆ°ç±»åž‹ï¼ˆC<isa>)的时候。 =head1 多属性快æ·åˆ›å»º å¦‚æžœä½ æœ‰å¤§é‡çš„属性仅仅是åå—ä¸åŒï¼Œä½ å¯ä»¥ä¸€æ¬¡æ€§çš„声明它们。 package Point; use Moose; has [ 'x', 'y' ] => ( is => 'ro', isa => 'Int' ); å› ä¸º C<has> ä¹Ÿæ˜¯ä¸€ä¸ªå‡½æ•°ï¼Œæ‰€ä»¥ä½ ä¹Ÿå¯ä»¥é€šè¿‡å¾ªçŽ¯æ¥åˆ›å»ºã€‚ for my $name ( qw( x y ) ) { my $builder = '_build_' . $name; has $name => ( is => 'ro', isa => 'Int', builder => $builder ); } =head1 更多 Moose 属性是一个 big topic,而这个文档åªåŒ…å«äº†ä¸€éƒ¨åˆ†ã€‚æˆ‘ä»¬å»ºè®®ä½ ç»§ç»é˜…读L<Moose::Manual::Delegation> å’Œ L<Moose::Manual::Types> æ¥æ›´å…¨é¢çš„了解属性。 =head1 æ›´å¤šçš„é€‰é¡¹ä¿¡æ¯ Moose 属性有许多选项。下é¢åˆ—å‡ºä¸€äº›ä½ å¯èƒ½ä¼šæ¯”较感兴趣的。 =head2 C<文档æè¿°> ä½ å¯ä»¥ä¸ºä½ 的属性æ供一个文档æ述。 has 'first_name' => ( is => 'rw', documentation => q{The person's first (personal) name}, ); Moose 会把该æè¿°å˜å‚¨èµ·æ¥ã€‚ =head2 C<åºåˆ—化数æ®> å¦‚æžœä½ çš„å±žæ€§æ˜¯ä¸€æ®µæ•°ç»„å¼•ç”¨æˆ–è€… hash 引用,C<auto_deref> 这个设置会让 reader æ¥è®¿é—®è¿™ä¸ªå±žæ€§æ—¶ï¼Œå¯ä»¥çœ‹åˆ°åºåˆ—化以åŽçš„内容: my %map = $object->mapping; å½“ç„¶è¿™ä»…ä»…åœ¨ä½ çš„å±žæ€§æ˜¯ C<ArrayRef> 或者 C<HashRef> 时有用。 我们推èä½ æŸ¥é˜… L<Moose::Meta::Attribute::Native> æ¥å¾—到更多信æ¯ã€‚ =head2 åˆå§‹åŒ– Moose æ供一个选项å«åš C<initializer>ã€‚è¿™ä¸ªä¼šåœ¨æž„é€ å‡½æ•°ä¸æ”¹å˜å±žæ€§å€¼ã€‚ =head1 作者 Moose 是由许多志愿者共åŒåŠªåŠ›çš„结果。具体的请å‚看L<Moose/CABAL> å’Œ L<Moose/CONTRIBUTORS>译者:xiaomo(wxm4ever@gmail.com) =head1 版æƒå’Œè®¸å¯ This software is copyright (c) 2011 by Infinity Interactive, Inc.. 这是自由软件,您å¯ä»¥é‡æ–°åˆ†é…æˆ–è€…æ ¹æ® Perl 5 的编程è¯è¨€ç³»ç»Ÿæœ¬èº«ç›¸å…³çš„æ¡æ¬¾è¿›è¡Œä¿®æ”¹ã€‚