Sziasztok,
elértem a Perl oop részéhez, ahol gyorsan el is akadtam :)
Van egy egyszerű példakód , amihez magyarázatot kérek.
Nem az a gond, hogy nem tudom mit csinál, hanem a "hogyan" és a "miért" nem tiszta.
A new konstruktor egy tömböt kap. Aztán visszaad egy hivatkozást az adatszerkezetre.
Az area nevű példánymetódus mit kap?
Tömböt? merthogy a shift valaminek levágja az 1. elemét, ami alapján lista vagy tömb lehet.
Amit meg levág, azt visszaadja a $self-nek, ami meg kivonatként viselkedik tovább "->" miatt.
Akkor mégis kivonatot kap az area?? Nem értem.
Mikor mit jelent a @_ ebben a kódban?
Előre köszönök minden segítő jellegű magyarázó kommentet!
- 830 megtekintés
Hozzászólások
Hello,
a @_ tomb a parametereknek a sub-on belul.
$sq = new Rectangle (12,20);
innen a new-ban:
$classname = Rectangle
$w = 12
$h = 20;
a new-ban a bless csinal object-et, amit az area megkap elso parameterkent (shift a default @_-n ), es utana erre hivatkozol.
- A hozzászóláshoz be kell jelentkezni
A shift paraméter nélkül sub-on belül a @_ tömbből csipkedi le az elemeket (első, második, harmadik, stb. függvény paraméter). Nem sub-on belül pedig az @ARGV-ből. A példakód picit másképp felírva:
https://jsi.jss.hu/rectangle.pl
vagy pedig így, és akkor a konstruktor hívása beszédes. Az első paramétert (osztály nevét) a shift-el lekapjuk, a maradék paramétereket kulcs-érték páronként a %props hash-be tesszük, majd ennek referenciáját (mutatóját ha úgy tetszik) adjuk át a bless-nek a \ segítségével.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, mindkettő hsz-ra reagálva:
ezek szerint ami példányváltozót létrehozunk a new-ban, azt minden sub megkapja @_ 1. elemben, csak
első körben le kell kapni shifttel?
Az zavart meg, hogy
a new-ban:
my ($classname, $w, $h) = @_; az 1. elem "Rectangle", mint string (még nem tudom, mire jó).
az area-ban:
sub area {
my $self = shift; itt pedig az 1. elem "Rectangle", mint objektum (ezzel lehet tovább dolgozni).
- A hozzászóláshoz be kell jelentkezni
Igen. Példányosításnál a Rectangle->new(12, 20) esetén az osztályod neve kerül az első paraméterbe. Ez a bless-nek kell, hogy az adatszerkezetedet ($self) össze tudja házasítani az osztállyal. Innen tudja a Perl, hogy egy objektum melyik osztály példánya. Ezt egyébként el is lehet hagyni, mert alapértelmezett, de jobb ha megszokod az írásmódját. Ez akkor jön jól, amikor már az öröklődés is képbe jön.
A sub area nem magától kapja meg első paraméterként az objektumot, hanem te hívod meg így:
my $pq = Rectangle->new;
$pq->area;
A my $self = shift;
pedig állandó vendég a Perl OOP-ben:)
Ha már OOP, akkor érdemes megnézni a Moose projektet, ami elsőre nem is olyan egyszerű. Én a Mojolicious keretrendszerhez tartozó Mojo::Base modult preferálom, mert nagyon letisztult megoldást nyújt. Nem váltja ki az eddigi Perl OOP-t, hanem kiegészíti!
- A hozzászóláshoz be kell jelentkezni
Most már minden világos, köszi!
Megnéztem, de szerintem nekem még korai :)
- A hozzászóláshoz be kell jelentkezni