取势 明道 优术

Moose::Manual::Classes 92 views

作者为 扶 凯 发表


名称

 


名称

Moose::Manual::Classes – 在你的class和subclass里面使用Moose


版本

version 2.0402


使用moose

使用Moose非常简单,你只需要在代码里面声明 use Moose

package Person;
use Moose;

现在,你已经创建了一个Moose的Class.

Moose在幕后做了很多的工作,我们一步一步来了解它们。

当你载入Moose,一系列的语法糖也就导入到了你刚才创建的这个类里面了,例如: extends,has,with etc.你可以使用这些函数来定义你的类.例如,定义一个类的属性

package Person;
use Moose;
has 'ssn' => ( is => 'rw' );

有关属性的描述,你可以在the Moose::Manual::Attributes manpage找到。

载入Moose同样为你的class使用了strict和warnings,你可以不需要自己来设置了。

当你载入了Moose,你的class将会成为the Moose::Object manpage的子类,the Moose::Object manpage类提供了默认的构造函数和析构函数,在之前的
the Moose::Manual::Construction manpage里面我们已经提到过.

Moose还为你的class创建了一个新的type,参考the Moose::Manual::Types manpage.

同样,还有the Moose::Meta::Class manpage,你可以通过meta方法来调用metaclass对象,例如

Person->meta;

metaclass为你的class提供了自省的API,Moose自身也是通过metaclass来添加属性,定义父类,所有的语法糖都是通过metaclass对象来实现的。


子类

Moose提供了极为简单好记的语法糖来声明父类, extends

package User;
use Moose;
extends 'Person';
has 'username' => ( is => 'rw' );

每次你调用extends的时候都会重新设置你的父类,当然你还可以一次声明多个父类,只是多重继承不是啥好东西。

cpan不是所有的模块都是moose写的,因此有时候,我们需要封装一些原来不是moose的类,这些类的构造函数通常都是new函数,这个时候 我们之前说的has之类的语法糖就没什么用处了,你必须小心翼翼的处理new函数,bless之类操作必不可少,moose在这里魔力全无。

如果你有兴趣封装一些不是moose的模块,你可以仔细看看the MooseX::NonMoose manpage,不过哥提醒你封装之前是不是已经有人封装过了,别做无谓的劳动,好不容易封装了个LWP,发现老外已经写好了,而且自己的写的跟狗屎一样。


清除Moose命名空间

Moose导出了一大堆函数到你的类里面,在你工作都完成以后,我们需要清理命名空间,清理完成之后, Person->can(‘has’) 就不是返回真了。

有很多方式可以清理命名空间,我们推荐你用the namespace::autoclean manpage,这个是一个cpan的模块,他不仅可以移除掉Moose的命名空间,还可以移除掉你导出的其他方法.

package Person;
use namespace::autoclean;
use Moose;

如果你除了导入了Moose,其他什么cpan模块都没有使用,可以简单的在代码末端使用 no Moose来清除,

package Person;
use Moose;
has 'ssn' => ( is => 'rw' );
no Moose;


让Moose跑的更快

Moose有一个特性叫做”immutabilization”,使用它可以大大提高你的class的运行速度,只是在刚开始载入的时候有一些损耗。当你使用了这一特性,你将不能再改变class里面的任何的attributes,method,roles,etc

这么干会为你的class专门生成内联的构造函数,让对象构造的速度更快速.

要使用这一特性,你只需要通过meta来调用 make_immutable

__PACKAGE__->meta->make_immutable;

Immutabilization 和 new()

Immutabilization也不是万能的,如果你有傻逼的写了自己的new函数,就完全起不到加速的效果,除非你调用了 BUILD 方法,此方法会直接调用内联的构造函数.

如果你真的需要编写自己的new方法,你可以编写自己的immutabilization方法,这么做需要扩展Moose的metaclass,这里的内容日后再说吧,哥还没看过呢.


作者

翻译 :斯文牛氓
原文链接:https://metacpan.org/module/Moose::Meta::Class


版权

perlchina 官方交流群作品,欢迎加入群内共同学习进步

qq群 : 211685345

email: perlfan.com@gmail.com


BUGS

鉴于本人英文水平有限,可能翻译的不如原汁原味的英文原著,如有不当之处望不吝指出,不要直接劈头盖脸的否定,毕竟翻译也需要时间和心血,本人翻译 纯粹是出于个人爱好,目的也是为了学习和交流,因此,如果你有什么好的建议和疑惑可以发送到我的邮箱,我会尽力改正,当然如果您无论如何都想喷哥的话,哥 也爱莫能助,请轻虐.

感谢斯文牛氓兄,在取得他本人同意的前题下,给这个文章转过来.原文地址:http://perlfan.com/index.php/moosemanualclasses/

来了就留个评论吧! 没有评论