Fragen zu UNIVERSAL
am 16.08.2006 15:36:14 von Ferry Bolhar
Hallo,
bisher dachte ich, es gäbe nur einen UNIVERSAL Namespace - nämlich
den, in den man Methoden aufnimmt, die in allen Klassen bekannt sein
sollen, so wie die eingebauten Methoden "isa", "can" und "VERSION".
Welchen Sinn machte es dann, zB.
*{'MyModule::UNIVERSAL::MyMethod'} = sub {...};
zu schreiben, wie ich das im Code eines Modules gesehen habe?
Und was bringt es dann,
push @UNIVERSAL::ISA, 'MyModule::UNIVERSAL';
zu schreiben?
(Der Code stammt übrigens - vereinfacht - aus Attribute::Handlers).
Danke für eure Antworten & LG,
Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at
Re: Fragen zu UNIVERSAL
am 16.08.2006 18:17:52 von Ingo Menger
Ferry Bolhar schrieb:
> Hallo,
>
> bisher dachte ich, es gäbe nur einen UNIVERSAL Namespace - nämlich
> den, in den man Methoden aufnimmt, die in allen Klassen bekannt sein
> sollen, so wie die eingebauten Methoden "isa", "can" und "VERSION".
>
> Welchen Sinn machte es dann, zB.
>
> *{'MyModule::UNIVERSAL::MyMethod'} =3D sub {...};
>
> zu schreiben, wie ich das im Code eines Modules gesehen habe?
Das ist ja erst mal akzidentiell, bzw. irrelevant, wenn irgendwo in der
Mitte UNIVERSAL steht. Es ist ja auch nicht verboten, ein Modul
"METAUNIVERSALITÄT" zu benennen.
>
> Und was bringt es dann,
>
> push @UNIVERSAL::ISA, 'MyModule::UNIVERSAL';
>
> zu schreiben?
>
> (Der Code stammt übrigens - vereinfacht - aus Attribute::Handlers).
Ich rate mal: damit wird MyModue::UNIVERSAL zur Superklasse jeder
anderen Klasse einschließlich UNIVERSAL gemacht. Ein Hack, wie er im
Buche steht, ob es funktioniert hängt freilich leider davon ab, ob und
inwiefern perl die UNIVERSAL-Klasse speziell behandelt oder nicht.
Re: Fragen zu UNIVERSAL
am 17.08.2006 11:35:30 von Ferry Bolhar
Ingo Menger:
>> Welchen Sinn machte es dann, zB.
>>
>> *{'MyModule::UNIVERSAL::MyMethod'} = sub {...};
>>
>> zu schreiben, wie ich das im Code eines Modules gesehen habe?
>
> Das ist ja erst mal akzidentiell,
^^^^^^^^^
Was ist das für ein Wort?
> bzw. irrelevant, wenn irgendwo in der
> Mitte UNIVERSAL steht. Es ist ja auch nicht verboten, ein Modul
> "METAUNIVERSALITÄT" zu benennen.
Natürlich nicht, ich wollte bloß den Sinn dahinter ergründen.
>> Und was bringt es dann,
>>
>> push @UNIVERSAL::ISA, 'MyModule::UNIVERSAL';
>>
>> zu schreiben?
>>
>> (Der Code stammt übrigens - vereinfacht - aus Attribute::Handlers).
>
> Ich rate mal: damit wird MyModue::UNIVERSAL zur Superklasse jeder
> anderen Klasse einschließlich UNIVERSAL gemacht. Ein Hack, wie er im
> Buche steht, ob es funktioniert hängt freilich leider davon ab, ob und
> inwiefern perl die UNIVERSAL-Klasse speziell behandelt oder nicht.
Funktionieren dürfte es wohl, der Code stammt wie gesagt aus
Attribute::Handlers (welches seit 5.8 Teil der Standarddistribution ist),
und wird als solcher wohl entsprechend getestet worden sein. Mir war
der Zweck von UNIVERSAL klar, aber es war mir neu, dass damit
auch der ISA-Mechanismus greift - ich dachte bisher, UNIVERSAL
würde erst verwendet, wenn ISA fehlschlägt - dh., wenn eine Methode
weder in der eigenen Klasse, noch in allen vererbten Klassen (eben jene
in @ISA) gefunden wird, wird noch in UNIVERSAL nachgesehen, ob
es sie dort gibt, und falls auch das nicht der Fall ist, war's das dann.
Daher habe ich das obige "push" nicht verstanden (und verstehe es auch
jetzt noch nicht).
Ich persönlich halte den Umgang mit Methoden und UNIVERSAL
übrigens genauso für umstritten wie mit normalen Funktionen und
CORE:: bzw. CORE::GLOBAL::.
LG, Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at
Re: Fragen zu UNIVERSAL
am 17.08.2006 11:55:57 von Ingo Menger
Ferry Bolhar schrieb:
> Ingo Menger:
>
> >> Welchen Sinn machte es dann, zB.
> >>
> >> *{'MyModule::UNIVERSAL::MyMethod'} =3D sub {...};
> >>
> >> zu schreiben, wie ich das im Code eines Modules gesehen habe?
> >
> > Das ist ja erst mal akzidentiell,
> ^^^^^^^^^
>
> Was ist das für ein Wort?
Wenn ich es recht bedenke, ist das ein hier falsch angewendetes Wort,
denn es bedeutet so viel wie "zufällig".
> Funktionieren dürfte es wohl, der Code stammt wie gesagt aus
> Attribute::Handlers (welches seit 5.8 Teil der Standarddistribution ist),
> und wird als solcher wohl entsprechend getestet worden sein. Mir war
> der Zweck von UNIVERSAL klar, aber es war mir neu, dass damit
> auch der ISA-Mechanismus greift - ich dachte bisher, UNIVERSAL
> würde erst verwendet, wenn ISA fehlschlägt
Ja sicher, aber halt offenbar so, "als ob" am Ende jeder @ISA-Liste
noch "UNIVERSAL" stünde, d.h. die @ISA Liste von UNIVERSAL selbst wird
auch abgearbeitet. Dies müßte, wenn nicht extra abgefangen, zu einer
Endlosschleife führen, d.h. die Abbruchbedingung der Suche heißt
offenbar "bin am Ende der @ISA Liste von UNIVERSAL"
>- dh., wenn eine Methode
> weder in der eigenen Klasse, noch in allen vererbten Klassen (eben jene
> in @ISA) gefunden wird, wird noch in UNIVERSAL nachgesehen, ob
> es sie dort gibt,
.. wobei eben "in Klasse X nachsehen" heißt "in Klasse X und
sämtlichen Superklassen von X nachsehen"
> Daher habe ich das obige "push" nicht verstanden (und verstehe es auch
> jetzt noch nicht).
Ich verstehe nicht, wozu sie das brauchen. Wie es funktionieren soll,
glaube ich schon zu verstehen.