你如何在Perl中创建对象?

时间:2008-08-11 15:57:35

标签: perl oop syntax

Perl具有OOP功能,但它们很少使用。如何使用方法和属性创建和使用Perl对象?

7 个答案:

答案 0 :(得分:23)

你一定要看看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,这不是完整的,但没有大部分编译时间的惩罚。

答案 1 :(得分:8)

绝对是

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";

等等。不仅如此,您的访问器方法也可以免费进行类型检查(您可以定义自己的类型以及标准类型)。另外,你可以获得子类化的“扩展”,角色/特征的'with',以及各种其他优秀的东西,它们可以让你继续完成编写优秀健壮的可维护OO代码的实际工作。

TMTOWTDI,但这个有效。

答案 2 :(得分:5)

目前,每当我想要对象时,我都会使用Object::InsideOut,它非常好用,并且会比标准的祝福哈希对象提供很多功能。话虽如此,如果我开始一个新项目,我会认真看看穆斯。

虽然阅读官方PERL文档很好,但我会建议尝试使用自己的对象框架,或者使用哈希构建对象,它很容易走上简单的道路,“峰值“直接进入对象”私有“变量完全打破封装,当你想重构对象时,这会回来咬你。

答案 3 :(得分:5)

Perl对象不仅仅是祝福的哈希。他们是幸运的参考。它们可以(并且通常是)受祝福的哈希引用,但它们可以很容易地成为受祝福的标量或数组引用。

答案 4 :(得分:3)

CPAN site的官方教程很好。

在CodeProject上还有一篇名为Camel POOP的好文章。

答案 5 :(得分:2)

如果你想在Perl中做OO,我强烈建议你看看Moose。但是,如果你不理解Perl中的OO意味着什么,它就没有用。为了更好地理解Perl OO如何在幕后工作,我在我的博客上写了一个概述:http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/

从数据结构的角度来看,Object是一个带有一些额外功能的引用。解释器知道将这些特殊引用视为对象,因为它们已经被关键字“bless”“祝福”。有福的引用包含一个标志,表明它们是一个对象。从本质上讲,这意味着您可以在它们上定义和调用方法。

例如,如果您创建了一个基本的hashref,这将不起作用: $ hashref-> FOO();

但是如果你创建一个有福的hashref(也就是一个Object),这确实有效: $ blessed_hashref-> FOO();

Moose是Perl中OOP的优秀模块,因为它创建了一个可强制执行的OO层并自动处理访问器方法,因此您不必定义一堆getter和setter。如果您有兴趣使用Devel :: Peak查看Perl解释器如何存储对象,请点击上面发布的博客条目链接。

答案 6 :(得分:1)

单脚,每个班级都是一个包;通过设置包变量@ISA(最好在编译时)建立(多个,如果需要)继承;您使用bless(REFERENCE [,CLASSNAME])从现有数据(通常但不总是,用于存储实例变量的匿名哈希)创建对象;您可以调用对象方法,如$ obj-> methodname(@ARGS)和类方法,如“CLASSNAME” - > methodname(@ARGS)。 可以使用mro更改多重继承方法解析顺序。

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