Thread eval is evil: Willkommen auf der dunklen Seite?! (19 answers)
Opened by Ronnie at 2006-11-22 21:21

sid burn
 2006-11-22 23:58
#71922 #71922
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
Ruby erlaubt Methoden zur Laufzeit zu generieren und bietet auch Hook-Methoden wie undefined_method die aufgerufen werden wenn keine passende Methode existiert, was man wiederum nutzen kann um diese bei Bedarf zu generieren. Ich bin noch nicht wirklich weit mit dem Thema, habe aber eben schon überlegt wie es auf Perl transferierbar sein könnte.

Dafür kannst du doch die Subroutine AUTOLOAD benutzen.
Immer wenn eine Funktion/Methode nicht existiert wird die Subroutine AUTOLOAD aufgerufen.

Wenn du in diesem Package noch die Globale Variable $AUTOLOAD anlegst, dann enthält diese Variable den kompletten Funktionaufruf. In der Funktion AUTLOAD enthält @_ alle Paremeter mit der du deine Funktion aufgerufen hast.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use warnings;
use strict;

our $AUTOLOAD;
sub AUTOLOAD {
$" = ', ';
print "Es wurde [$AUTOLOAD] mit den Parametern [@_] aufgerufen\n";
}

hallo();
welt( 'foo' );
wie( 'bar', 'shoe' );


Bei der Ausführung kommt dann folgendes heraus

Code: (dl )
1
2
3
Es wurde [main::hallo] mit den Parametern [] aufgerufen
Es wurde [main::welt] mit den Parametern [foo] aufgerufen
Es wurde [main::wie] mit den Parametern [bar, shoe] aufgerufen


Wenn du nun innerhalb der Funktion AUTOLOAD die Subroutine mit String eval erzeugst dann hast du deine erstellte Methode. Nachdem die Methode einmal in dem package existiert wird danach ja die Methode aufgerufen. Und nicht mehr die AUTOLOAD Subroutine.

Das einzige worauf do achten musst ist auf die Methode DESTROY. Entweder brichst du bei der Methode ab, oder du definierst eine leere Methode DESTROY.

Am besten vor allem bei der OOP ist es immer eine Methode DESTROY zu erstellen die folgendes beinhaltet.
Code: (dl )
$self->SUPER::DESTROY()

Wenn du es nicht machst kann es zur Folge haben das die Vererbung mit der Methode nicht mehr klappt.


Ganz zum Schluss musst du nur beachten das du die Methode auch noch in AUTOLOAD aufrufst, sonst erstellst du sie zwar beim ersten Aufruf, führst sie aber nicht aus.

Von daher reicht es nach dem erstellen die Methode einfach aufzurufen "erstellte_methode(@_)". @_ enthält ja alle Parameter mit der du deine Methode aufgerufen hast.

Besser und so steht es im Buch ist aber "goto &erstellte_ethode". Das soll den Vorteil haben das wenn du das Programm irgendwie pofilierst (wie auch immer das heißt) das der Aufruf von AUTOLOAD nicht sichtbar ist. Mit goto wird die aktuelle Funktion durch eine andere ersetzt. Weiterhin wird die Funktion automatisch mit den Parameter von @_ aufgerufen.\n\n

<!--EDIT|sid burn|1164233722-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread eval is evil: Willkommen auf der dunklen Seite?!