***************************************************** * 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::Construction - Moose 构造与析构 =head1 VERSION version 2.0401 =head1 什么是构造器? B<不要再为你的类定义 C 方法了!>。 当你 C 之后,你的类就成为了 L 的子类。L为你提供了 C 方法。如果你按照 L 推荐那样,并且使你的类 immutable 的话,那你已经得到了一个内置的 C 方法了。 =head1 对象的构造和属性 Moose 允许你在初始化实例时通过哈希表或者哈希引用等方式来传递参数(实际上,是根据 C 的设置来进行)。你不需要再烦恼具体是怎么实现的了,Moose已经为你做好了。 =head1 对象构造中的 HOOKS Moose 允许你在构造过程中使用 hook。你可以通过 hook 来验证一个对象的状态,做日志,自定义参数不匹配时的行为,或者允许非哈希引用作为参数传递等等。你可以通过C 或 C 来设置 hook。 If these methods exist in your class, Moose will arrange for them to be called as part of the object construction process. =head2 BUILDARGS C 方法在对象构造I<之前>被调用,它接受 C 传递进来的所有参数,并且返回一个哈希引用。这个哈希引用最终用来构建对象。 一个最常见的用法就是 C 实现非哈希引用的参数传递。比如我们想 C类可以通过社保号来直接引用对象,C<new($ssn)>>。 没有 C 方法处理的话,Moose 处理的时候可能就不会如你所愿了。因为默认的Moose 是不能那样处理参数的,所以我们用 C 来处理这种参数传递。 around BUILDARGS => sub { my $orig = shift; my $class = shift; if ( @_ == 1 && !ref $_[0] ) { return $class->$orig( ssn => $_[0] ); } else { return $class->$orig(@_); } }; 这里 C<<$class->$orig>>是调用 Moose 内部的 C。 =head2 BUILD C 方法是在对象创建完I<之后>被调用的。很多情况下我们需要使用它。最普遍的就是检测对象的状态时。虽然我们可以通过使用类型的单个属性来验证,不过我们无法验证一个整体的对象的状态。 sub BUILD { my $self = shift; if ( $self->country_of_residence eq 'USA' ) { die 'All US residents must have an SSN'\m } } 另一个用法就是可以追踪对象构造过程。 sub BUILD { my $self = shift; debug( 'Made a new person - SSN = ', $self->ssn, ); } 在对象构造的时候,我们可以从日志中看到对象构造的记录,并且还可以在对象里面添加一些附加的信息。 sub BUILD { my $self = shift; my $args = shift; $self->add_friend( My::User->new( user_id => $args->{user_id}, ) ); } =head3 BUILD 和 父类 Moose 的继承层次结构上与旧式的 Perl 5 OO 不同。B<你不应该写 C<<$self->SUPER::BUILD>>>,或是把 C方法应用于方法修饰符 Moose 调用 C 方法的顺序是先父类后子类。这似乎颠覆了传统的对象调用方法顺序,不过不要感到惊讶,Moose 就是这么干的。 这个顺序还是很有意义的,这是一种日益专业化的方法。而且,Perl 6 也是这么做的。 =head1 对象的析构 Moose 通过 C 方法来提供对象析构时的 hook。和 C 相似,你永远不应该使用 C<<$self->SUPER::DEMOLISH>>。它的调用顺序也是先调用父类后子类。 每个 C 方法被调用时只接受到一个参数。 多数情况下,你不会用到该方法。 =head2 析构过程中的错误处理 对象销毁时与 Perl 的全局变量 C<$@> 和 S> 在这时候会非常混乱。 Moose 总是在销毁对象时本地化 S。如果你这时候调用> C,exit 代码将会被保存起来,即便对象销毁正在做系统调用。 Moose 同样会针对 C 来保存 C<$@>。如果你在 C 中使用 die,Moose会重复抛出错误。 如果你不喜欢这样的处理方式,你不得不去写自己的 C 方法来取代内置的。 =head1 作者 Moose 是由许多志愿者共同努力的结果。具体的请参看 L 和L译者:xiaomo(wxm4ever@gmail.com) =head1 版权和许可 This software is copyright (c) 2011 by Infinity Interactive, Inc.. 这是自由软件,您可以重新分配或者根据 Perl 5 的编程语言系统本身相关的条款进行修改。