你如何在 Perl 中创建对象?
Posted
技术标签:
【中文标题】你如何在 Perl 中创建对象?【英文标题】:How do you create objects in Perl? 【发布时间】:2010-09-05 16:37:01 【问题描述】:Perl 具有 OOP 功能,但它们很少使用。如何创建和使用带有方法和属性的 Perl 对象?
【问题讨论】:
【参考方案1】:你一定要看看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
,它并不完整,但没有大部分编译时间损失。
【讨论】:
如果您只需要 Moose 的简单功能,也可以使用鼠标 对于 Moose 的新手有什么好的教程吗?谢谢 @Alexandr,谢谢更新了答案。 @melaos 我已经编辑了答案以提供链接 清理了部分markdown链接,将Moose::Intro
改为Moose::Cookbook
。
我在 Catalyzed.org 上看到的关于 Moose 的最佳介绍:catalyzed.org/2009/06/a-gentle-introduction-to-moose.html 即使作为一名经验丰富的 Perl 程序员,我也有一段时间避免使用 Moose,因为它看起来很混乱。【参考方案2】:
Moose,肯定的。
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";
等等。不仅如此,您的访问器方法还可以免费进行类型检查(您可以定义自己的类型以及标准类型)。此外,您还可以获得用于子类化的 'extends'、用于角色/特征的 'with' 以及各种其他很棒的东西,让您可以继续编写良好的、健壮的、可维护的 OO 代码。
TMTOWTDI,但这个有效。
【讨论】:
【参考方案3】:目前,每当我想要对象时,我都会使用Object::InsideOut,它非常好,并且会为您提供比标准祝福哈希对象更多的功能。话虽如此,如果我开始一个新项目,我会认真考虑 Moose。
虽然阅读官方 PERL 文档很好,但我不建议尝试扮演您自己的对象框架,或使用哈希构建对象,这很容易让人走上轻松的道路,并且“ peak”直接插入对象的“私有”变量中,完全打破封装,当你想重构对象时,这会回来咬你。
【讨论】:
【参考方案4】:Perl 对象不仅仅是有福的散列。他们是有福的参考。它们可以(并且通常是)有福的哈希引用,但它们也可以很容易地成为有福的标量或数组引用。
【讨论】:
【参考方案5】:CPAN site上的官方教程不错。
CodeProject 上还有一篇名为Camel POOP 的好文章。
【讨论】:
请注意,如果您有正常的 Perl 安装,所有 perldoc 教程也可以在命令行中使用:perldoc perltoot 就可以了。 (有关 Perl 中对象的更多乐趣,另请参阅 perldoc perlboot。)【参考方案6】:如果您想在 Perl 中进行 OO,我强烈建议您看看 Moose。但是,如果您不了解 Perl 中的 OO 是什么意思,它就不是很有用。为了更好地理解 Perl OO 的工作原理,我在我的博客上写了一个概述:http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/
从数据结构的角度来看,对象是具有一些额外功能的引用。解释器知道将这些特殊引用视为对象,因为它们已被关键字“bless”“祝福”。 Blessed 引用包含一个标志,表明它们是一个对象。本质上,这意味着您可以在它们上定义和调用方法。
例如,如果您创建了一个基本的 hashref,这将不起作用: $hashref->foo();
但是,如果您创建一个祝福的 hashref(又名对象),这确实有效: $blessed_hashref->foo();
Moose 是 Perl 中用于 OOP 的优秀模块,因为它创建了一个可执行的 OO 层并自动处理访问器方法,因此您不必定义一堆 getter 和 setter。如果您有兴趣使用 Devel::Peak 查看 Perl 解释器如何存储对象,请点击我在上面发布的博客条目的链接。
【讨论】:
【参考方案7】:一方面,每个类都是一个包;您通过设置包变量@ISA(最好在编译时)来建立(如果需要,多个)继承;您使用bless(REFERENCE [, CLASSNAME]) 从现有数据(通常但不总是用于存储实例变量的匿名哈希)创建一个对象;您可以调用 $obj->methodname(@ARGS) 之类的对象方法和“CLASSNAME”->methodname(@ARGS) 之类的类方法。 可以使用mro 更改多重继承方法解析顺序。
因为这有点简约并且不强制封装,所以有许多不同的模块可以提供更多或不同的功能。
【讨论】:
以上是关于你如何在 Perl 中创建对象?的主要内容,如果未能解决你的问题,请参考以下文章