如何在Perl中创建对象?
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解释器如何存储对象感兴趣,请单击指向我上面发布的博客条目的链接。