你如何在Perl中创建对象?

and*_*wrk 12 oop syntax perl

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

Pat*_*Pat 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);
}
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

一个很好的起点是Moose::ManualMoose::Cookbook

如果你只需要基本的东西,你也可以使用Mouse哪个不完整,但没有大部分的编译时间惩罚.


Pen*_*old 8

,当然.

package Person;
use Moose;
has age => ( isa => Int, is => 'rw'); 
has name => ( isa => Str, is => 'rw'); 
1;
Run Code Online (Sandbox Code Playgroud)

您可以立即免费获得new()方法,以及刚刚使用'has'定义的属性的访问器方法.所以,你可以说:

my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";
Run Code Online (Sandbox Code Playgroud)

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

TMTOWTDI,但这个有效.


Mat*_*son 5

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

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


Mic*_*mer 5

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