Zauważyłem, że podczas wywoływania metody nadklasy jest, trzeba zrobić coś takiego:Dlaczego perl's SUPER call nie używa metody arrow?
my $self = $class->SUPER::new();
Dlaczego nie jest to, że:
my $self = $class->SUPER->new();
Zauważyłem, że podczas wywoływania metody nadklasy jest, trzeba zrobić coś takiego:Dlaczego perl's SUPER call nie używa metody arrow?
my $self = $class->SUPER::new();
Dlaczego nie jest to, że:
my $self = $class->SUPER->new();
podejrzewam ponieważ $class->SUPER->new()
zwykle taka sama jak $class->SUPER()->new()
. Ale nie ma funkcji $class->SUPER()
i nie jest jasne, co by to powróciło.
Z drugiej strony, $class->Foo::Bar
zawsze był prawidłowym sposobem wywoływania metody bezpośrednio po imieniu, tak więc wykonanie specjalnej rzeczy w opakowaniu - SUPER
- pasuje lepiej. (Podejrzewam, że może faktycznie realizować SUPER
jako pakiet, a może to było w przeszłości, nie wiem)
PS: Spójrz na opakowaniu mro
i $self->next::method
. Przyjrzyj się także Moose, jeśli zamierzasz poważnie pracować w Perlu.
Chcę zrozumieć rzeczy, zanim będę używał Łosia. – Geo
Zapoznaj się z _A Delikatny wstęp do Moose_ http://www.catalyzed.org/2009/06/a-gentle-introduction-to-moose.html –
@Geo, Tylko ty * myślisz * chcesz wiedzieć więcej. Mogę szczerze powiedzieć, że lepiej nie wiedzieć o tym, dopóki się z tym nie spotkasz. –
Aby dodać do tego, co derobert powiedział:
Dzwonisz „nowy” w przestrzeni nazw „Super” ale przekazując mu obiekt (lub ciąg znaków), „$ class”.
Nie mieć używać SUPER, jak można podać pełną nazwę pakietu rodzica (przydatne w przypadku diamentu dziedziczenia):
sub init {
my $self = shift;
$self->ParentClass1::init();
$self->ParentClass2::init();
}
Inne ciekawostki: Właściwie możesz zrobić '$ self-> TotallyUnrelatedClass :: init()', ale prawdopodobnie lepiej tego nie robić! – derobert
wywołuje metodę mieć różne formy:
wywołuje metodę, ewentualnie dziedziczone:
->method()
Wyraźnie zwraca sub Pakiet :: metodę, czy to w drzewie dziedziczenia lub nie:
->Package::method()
Jawnie nazywa mowa-sub, czy to w drzewie dziedziczenia czy nie:
->$coderef()
wywołuje metodę, która byłaby wywoływana przez __PACKAGE__->method()
gdyby nie metoda sub w __PACKAGE__
(NB klasa lub obiekt po lewej ->
ma znaczenia):
->SUPER::method()
Każda z wyżej wymienionych, w zależności od zawartości $method
.
->$method()
(prawny nawet pod use strict;
)
Podczas gdy pierwsza forma jest najczęstsza, warto dowiedzieć się o innych i o tym, jak działają.
W skrócie, SUPER nie jest metodą. To wirtualny pakiet. Jest to udokumentowane w perlobj w sekcji "Wywołanie metody".
Należy jednak zauważyć, że SUPER opiera się na bieżącym pakiecie, a nie na pakiecie instancji, z którego go używałeś.
Geo, jeśli chcesz poznać drobiazgowe szczegóły przedmiotów w perlu, podnieś kopię Damiana Conwaya Object Oriented Perl http://www.manning.com/conway/ To bardzo szczegółowo opisuje różne sposoby użyj funkcji Perop OOP. Ma wszystko, od podstawowych błogosławionych skrótów do generowania dynamicznych metod, aż po błogosławione coderefs z egzotyki. To bardzo dobrze napisana książka. Ale także sprawdź Moose. Dla wielu, jeśli nie dla większości rzeczy, Moose jest właściwym sposobem na zrobienie Perl OOP. – daotoad