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::ManualMoose::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 对象不仅仅是受祝福的哈希值。他们是有福的参考。它们可以(而且通常是)受祝福的散列引用,但它们也可以很容易地成为受祝福的标量或数组引用。

官方教程在 CPAN网站 很好。

还有一篇不错的文章叫 骆驼便便 在代码项目。

如果你想用 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 解释器如何存储对象,请点击我上面发布的博客条目的链接。

一方面,每个类都是一个包;另一方面,每个类都是一个包。通过设置包变量来建立(多重,如果需要)继承 @ISA (最好在编译时);您可以从现有的数据片段(通常但并非总是用于存储实例变量的匿名散列)创建一个对象 保佑(参考[,类名]);您可以调用对象方法,如 $obj->methodname(@ARGS) 和类方法,如“CLASSNAME”->methodname(@ARGS)。可以使用以下命令更改多重继承方法解析顺序 姆罗.

因为这有点简约并且不强制封装,所以有许多不同的模块提供更多或不同的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top