用Moo来写面向对象perl
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既是读又是写,来的更浅显