题
Perl 具有 OOP 功能,但很少使用。如何创建和使用带有方法和属性的 Perl 对象?
解决方案
你绝对应该看看 Moose
.
package Point;
use Moose; # automatically turns on strict and warnings
has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');
sub clear {
my $self = shift;
$self->x(0);
$self->y(0);
}
Moose 为您免费提供(除其他外)构造函数、访问器方法和类型检查!
所以在你的代码中你可以:
my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15); # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5); # FAILS! Free type check.
一个好的起点是 Moose::Manual
和 Moose::Cookbook
如果您只需要基本的东西,您也可以使用 Mouse
这并不完整,但没有大部分编译时间损失。
其他提示
驼鹿, , 确实。
package Person;
use Moose;
has age => ( isa => Int, is => 'rw');
has name => ( isa => Str, is => 'rw');
1;
您立即可以免费获得一个 new() 方法,以及刚刚用“has”定义的属性的访问器方法。所以,你可以说:
my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";
等等。不仅如此,您的访问器方法还可以免费进行类型检查(您可以定义自己的类型以及标准类型)。另外,您还可以获得用于子类化的“扩展”、用于角色/特征的“with”以及各种其他很棒的东西,使您能够继续编写良好、健壮、可维护的面向对象代码的实际工作。
TMTOWTDI,但这一个有效。
目前我使用 对象::由内而外 每当我想要对象时,它都非常好,并且会为您提供比标准祝福哈希对象更多的功能。话虽如此,如果我要开始一个新项目,我会认真考虑 Moose。
虽然阅读官方 PERL 文档很好,但我会 不是 建议尝试使用自己的对象框架,或者使用哈希构建对象,走捷径并直接“峰值”到对象“私有”变量中完全打破封装是很诱人的,当你想要的时候,这会回来咬你重构对象。
Perl 对象不仅仅是受祝福的哈希值。他们是有福的参考。它们可以(而且通常是)受祝福的散列引用,但它们也可以很容易地成为受祝福的标量或数组引用。
如果你想用 Perl 进行面向对象,我强烈建议你看看 Moose。但是,如果您不理解 Perl 中 OO 的含义,那么它就没有多大用处。为了更好地理解 Perl OO 的底层工作原理,我在博客上写了一个概述: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/
从数据结构的角度来看,对象是具有一些额外功能的引用。解释器知道将这些特殊引用视为对象,因为它们已被关键字“bless”所“祝福”。Blessed 引用包含一个标志,表明它们是一个对象。本质上,这意味着您可以定义并调用它们的方法。
例如,如果您创建了一个基本的哈希引用,则这将不起作用:$hashref->foo();
但是如果你创建一个受祝福的 hashref (又名对象),这确实有效:$blessed_hashref->foo();
Moose 是 Perl 中 OOP 的一个优秀模块,因为它创建了一个可执行的 OO 层并自动处理访问器方法,因此您不必定义一堆 getter 和 setter。如果您有兴趣使用 Devel::Peak 来了解 Perl 解释器如何存储对象,请点击我上面发布的博客条目的链接。