如何在Perl中创建对象?

时间:2020-03-05 18:38:58  来源:igfitidea点击:

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

解决方案

回答

这是一个指南:http://www.tutorialspoint.com/perl/perl_oo_perl.htm

编辑:好点,我要删除复制的代码。

回答

CPAN网站上的官方教程很好。

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

回答

我们绝对应该看看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,它虽然不完整,但是没有大部分编译时间的损失。

回答

当前,每当我需要对象时,我都会使用Object :: InsideOut,它非常不错,并且会为我们提供许多优于标准的哈希对象的功能。话虽如此,如果我开始一个新项目,我会认真看一下穆斯。

虽然可以阅读PERL官方文档,但我不建议我们尝试使用自己的对象框架或者使用散列来构建对象,这很容易诱使我们轻松地将"峰值"直接放入对象"私有"变量中完全破坏封装,当我们要重构对象时,这会再次咬住我们。

回答

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

回答

驼鹿,肯定。

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

等等。不仅如此,访问器方法也可以免费进行类型检查(我们可以定义自己的类型以及标准类型)。另外,我们将获得用于子类的"扩展",用于角色/特征的"具有"以及其他各种出色的东西,这些都可以使我们继续从事编写良好的,可维护的OO代码的真正工作。

TMTOWTDI,但这一项可行。

回答

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

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

回答

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

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

例如,如果我们创建了基本的hashref,则将无法使用:
$ hashref-> foo();

但是,如果我们创建一个有福的hashref(又名Object),则可以使用:
$ blessed_hashref-> foo();

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