你如何在 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::ManualMoose::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 中创建对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中创建其他对象后如何自动创建新对象?

如何在 Kotlin 中创建静态函数而不创建对象

如何在 Haxe 中创建动作脚本对象

你如何调用在javascript中的数组中创建的对象的函数?

如何在 Perl 中创建 Zip 存档?

如何在 Microsoft Access 数据库中创建查询对象? [复制]