Cum creați obiecte în Perl?

Perl are caracteristici OOP, dar acestea sunt rareori folosite. Cum creați și utilizați obiecte Perl cu metode și proprietăți?

0
fr hi bn

8 răspunsuri

Here's a guide: http://www.tutorialspoint.com/perl/perl_oo_perl.htm

Edit: Bun punct, am eliminat codul copiat.

0
adăugat

Ar fi bine să aruncați o privire la 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 vă oferă (printre altele) un constructor, metode de acces și verificare de tip gratuit!

Deci, în codul dvs. puteți:

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.

A good starting point is Moose::Manual and Moose::Cookbook

Dacă aveți nevoie doar de lucrurile de bază, puteți utiliza și Mouse care este nu la fel de completă, dar fără cea mai mare parte a pedepselor compilate.

0
adăugat
@ Alexandr, mulțumesc actualizat răspunsul. @melaos Am editat răspunsul pentru a oferi link-uri
adăugat autor Pat, sursa
există vreun tutorial bun pentru începători pe Moose? Mulțumiri
adăugat autor melaos, sursa
Cel mai bun intro la Moose pe care l-am vazut este pe Catalyzed.org: Catalyzed.org/2009/06/a-gentle-introduction-to-moose.html Chiar ca un programator Perl experimentat, am evitat Moose pentru un timp, pentru ca parea confuz.
adăugat autor Drew Stephens, sursa
Curățați câteva linkuri de marcare și schimbați Moose :: Intro în Moose :: Cookbook .
adăugat autor Brad Gilbert, sursa
sau mouse-ul dacă aveți nevoie doar de caracteristici simple ale lui Moose
adăugat autor Alexandr Ciornii, sursa

Tutorialul oficial pe site-ul CPAN este bun.

Există, de asemenea, un bun articol numit Camel POOP la CodeProject.

0
adăugat
Rețineți că toate tutoriale perldoc sunt de asemenea disponibile la commandline, dacă aveți o instalare normală Perl: perltoot perldoc pentru asta. (A se vedea, de asemenea, PerlDoc perlboot pentru mai multă distracție cu obiectele din Perl.)
adăugat autor Telemachus, sursa

On one foot, each class is a package; you establish (multiple, if desired) inheritance by setting the package variable @ISA (preferably at compile time); you create an object from an existing piece of data (often, but not always, an anonymous hash used to store instance variables) with bless(REFERENCE [, CLASSNAME]); you call object methods like $obj->methodname(@ARGS) and class methods like "CLASSNAME"->methodname(@ARGS). Multiple inheritance method resolution order can be altered using mro.

Deoarece acest lucru este oarecum minimalist și nu forțează încapsularea, există multe module diferite care oferă funcționalități mai multe sau diferite.

0
adăugat

În prezent, folosesc Obiect :: InsideOut ori de câte ori doresc obiecte, destul de frumos și vă va oferi o mulțime de caracteristici peste obiecte standard binecuvântat hash. După ce am spus că, dacă am începe un nou proiect, m-aș uita serios la Moose.

Deși este bine să citiți documentația oficială PERL, aș recomanda NOT să încercați să faceți rolul propriului dvs. cadru de obiecte sau să construiți obiecte folosind hashes, departe de a încerca să luați direct drumul și "vârful" direct în variabilele "privat" ale obiectelor care încalcă complet încapsularea, aceasta va reveni pentru a vă mușca atunci când doriți să refacționați obiectul.

0
adăugat

Obiectele Perl NU sunt doar binecuvântări hashes. Sunt binecuvântați REFERINȚE. Ele pot fi (și de cele mai multe ori sunt) binecuvântate referințe de hash, dar ar putea fi la fel de ușor să fie binecuvântate referințe scalare sau matrice.

0
adăugat

Moose, definitely.

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

Imediat, aveți gratuit o metodă new() și metode accessor pentru atributele pe care tocmai le-ați definit cu 'has'. Deci, puteți spune:

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

si asa mai departe. Nu numai că, dar metodele accesorilor dvs. sunt tipizate gratuit (și puteți defini propriile tipuri, precum și cele standard). În plus, obțineți "extinde" pentru subclasare, "cu" pentru roluri/trăsături și toate felurile altor lucruri minunate care vă permit să continuați cu adevărata treabă de a scrie un bun cod robust OO de întreținere.

TMTOWTDI, dar acesta funcționează.

0
adăugat

I highly recommend taking a look at Moose if you want to do OO in Perl. However, it's not very useful if you don't understand what OO in Perl means. To better understand how Perl OO works under the hood, I wrote an overview on my blog: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/

Din punct de vedere al structurii datelor, un obiect este o referință cu câteva caracteristici suplimentare. Interpretul știe să trateze aceste referințe speciale ca Obiecte pentru că au fost "binecuvântați" cu cuvântul cheie "binecuvânteze". Relatările binecuvântate conțin un steag care indică faptul că ele sunt Obiect. În esență, acest lucru înseamnă că puteți defini și apela metode pe ele.

For instance if you created a basic hashref, this wouldn't work: $hashref->foo();

But if you create a blessed hashref (aka an Object) this does work: $blessed_hashref->foo();

Moose este un modul excelent pentru OOP în Perl, deoarece creează un strat OO aplicabil și manipulează automat metode accesoriale, astfel încât să nu fie nevoie să definiți o grămadă de getters și setteri. Dacă sunteți interesat să utilizați Devel :: Peak pentru a vedea modul în care interpretul Perl stochează obiecte, urmați linkul la intrarea pe blogul pe care l-am postat mai sus.

0
adăugat