用Moo来写面向对象perl

Tags:

Moose 大家庭

perl的原生的面向对象是比较简单的,通过bless关键字和hash来建立对象,很灵活但也很简陋

自从出现了Moose之后,perl的面向对象就很富有表现力了。

Moose -> Moos -> Moo -> Mo -> M, 再加上Mouse, 构成了Moose大家庭

从Moose到M依次功能递减, M 代表 nothing, 在不太复杂的项目一般用Moo就足够了

这里简单介绍一下Moo的用法

Moo -- 轻量级面向对象

比如我要建立一个Person对象,用Moo可以这么写:

package Person;
use Moo;

has name => is => 'rw';
has age  => is => 'rw';

sub intro {
    my $self = shift;
    print "My name is ". $self->name;
}

在你的代码里就可以这么建立一个Person对象:

use Person;

my $lip = Person->new(name => 'lip', age => 18 );
$lip->intro();

和perl的原生OOP一样,一个package就是一个对象。

Moo提供了一个has关键字,用来定义属性

has name => is => 'rw';

表示属性name 是 可读可写 的,如果写成'ro'就表示是只读的

sub intro 定义了一个方法, $self 是指代实例本身, $self->name 就可以得到name属性的值

下面详细介绍一些Moo的特性

属性定义 -- has

has attr => is => 'rw', default => 'default';

or

has attr => ( is => 'rw', default => 'default', )

因为小括号只是起到分组的作用,所以两种写法都是一样的。

has 的 options 有:

is(必要的) : 可以是'rw' 读写, 'ro' 只读, 'lazy' 惰性

isa : 用来定义这个属性的类型, 比如:

isa => sub { die "$_[0] is not a number!" unless looks_like_number $_[0] }

就确保该属性是一个数字。

default: 默认值,需要注意的是这里一般是传个匿名函数作为值,比如你要默认值为一个空数组引用:

default => sub { [] };

builder : 这个一般配合lazy使用,在lazy=1时,属性的值不会在对象建立的时候建立,而是在第一次求值的时候调用builder来计算

lazy : 如上

reader/writer : 你可以定义一个reader给属性, 比如 get_attr, 定义一个writer为 set_attr

            只是相比$self->attr既是读又是写,来的更浅显

对象继承 -- extends

方法修改器 -- before after around