Aufruf als Methode oder Funktion?
Aufruf als Methode oder Funktion?
am 18.05.2007 19:25:27 von Ferry Bolhar
Hallo,
ich hatte heute eine Diskussion mit einem unserer Perl-Gurus.
Dabei ging es um Methoden- und Funktionsaufrufe. Die Frage:
Gibt es für eine Funktion bzw. Methode eine einwandfreie
Möglichkeit festzustellen, wie sie aufgerufen wurde? Bei
Methoden wird als erstes Argument die Klasse bzw. das
Objekt übergeben:
'Klasse'->Methode();
$objekt->Methode();
Schön, das kann ich durch
Methode('Klasse');
Methode($objekt);
auch erreichen. Aber wie kann jetzt "Methode" feststellen,
wie sie aufgerufen wurde (dh., mit Objektsyntax und dem
"->" Operator, oder normal als Funktion)? Ich behaupte
mal, ohne ein bißchen XS-Code wird das nicht feststellbar
sein - falls überhaupt. Oder doch?
Schöne Grüße aus Wien,
Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Aufruf als Methode oder Funktion?
am 18.05.2007 20:03:26 von Frank Seitz
Ferry Bolhar wrote:
> Bei Methoden wird als erstes Argument die Klasse bzw. das
> Objekt übergeben:
>
> 'Klasse'->Methode();
> $objekt->Methode();
>
> Schön, das kann ich durch
>
> Methode('Klasse');
> Methode($objekt);
>
> auch erreichen.
Das ist nicht dasselbe. Die Parameterübergabe ist identisch,
die Semantik aber unterschiedlich: Im ersten Fall findet
u.U. eine Methodensuche statt, im zweiten Fall nicht.
> Aber wie kann jetzt "Methode" feststellen,
> wie sie aufgerufen wurde (dh., mit Objektsyntax und dem
> "->" Operator, oder normal als Funktion)?
Perl kennt den Unterschied. Mal angenommen,
"Methode" könnte ihn herausfinden. Was hätte "Methode" davon?
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Aufruf als Methode oder Funktion?
am 21.05.2007 03:23:43 von xxx
On Fri, 18 May 2007 19:25:27 +0200, "Ferry Bolhar"
wrote:
>Hallo,
>
>ich hatte heute eine Diskussion mit einem unserer Perl-Gurus.
>Dabei ging es um Methoden- und Funktionsaufrufe. Die Frage:
>
>Gibt es für eine Funktion bzw. Methode eine einwandfreie
>Möglichkeit festzustellen, wie sie aufgerufen wurde? Bei
>Methoden wird als erstes Argument die Klasse bzw. das
>Objekt übergeben:
>
>'Klasse'->Methode();
>$objekt->Methode();
>
>Schön, das kann ich durch
>
>Methode('Klasse');
>Methode($objekt);
Nein:
#!/usr/bin/perl -w
package Test;
sub new{
my $class=shift;
return bless{}, $class;
}
sub method {
my $self=shift;
print "ich bin ",$self,"\n";
}
package main;
my $t=Test->new;
$t->method;
Test::method($t);
# beide spit: Ich bin einTest=hash(0x...);
Test::method('Test');
#spits ich bin ein Test
>
>auch erreichen. Aber wie kann jetzt "Methode" feststellen,
>wie sie aufgerufen wurde (dh., mit Objektsyntax und dem
>"->" Operator, oder normal als Funktion)?
> Ich behaupte
>mal, ohne ein bißchen XS-Code wird das nicht feststellbar
>sein - falls überhaupt. Oder doch?
Sagen wir mal so: Dein Beitrag ist derart unbestimmt, daß es richtig
und falsch zugleich ist.
Umdennoch hilfreich zu sein:
der Funktionsauruf Test::method(), der ja eigentlich der korrekte
Funktionsaufruf ist, liefert undef.
Also ist ohne großes Federlesen die Art des Aufrufs durch die Sub
unterscheidbar.
Jedoch kann Test::method($t);
hier als Mimikry dienen. Insofern ist dies ununterscheidbar.
>
>Schöne Grüße aus Wien,
>
>Ferry
Schöne Grüsse aus München
Vielleicht braucht Ihr ja doch noch einen Perl-Programmierer?
----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----
Re: Aufruf als Methode oder Funktion?
am 21.05.2007 09:23:35 von Ferry Bolhar
"ralphl@xxx.uni-muenchen.de" schrieb im Newsbeitrag
news:19r153dicu5cucl798oql20fed7o630ffn@4ax.com...
>>Schön, das kann ich durch
>>
>>Methode('Klasse');
>>Methode($objekt);
> Nein:
> #!/usr/bin/perl -w
> package Test;
>
> sub new{
> my $class=shift;
> return bless{}, $class;
> }
>
> sub method {
> my $self=shift;
> print "ich bin ",$self,"\n";
> }
>
> package main;
> my $t=Test->new;
> $t->method;
> Test::method($t);
> # beide spit: Ich bin einTest=hash(0x...);
> Test::method('Test');
> #spits ich bin ein Test
Ich verstehe nicht, was du mit diesem Beispiel sagen willst.
Bei der Verwendung eines Objektes (einer "gesegneten"
Referenz) in der Form:
my $obj = bless {},'main';
und den beiden Aufrufen von "method()"
$obj->method();
method($obj);
wird in beiden Fällen etwas in der Art
main=HASH(0x7FEDC2A0)
ausgegeben. Auch bei der Angabe einer Klasse
'Klasse'->method();
method('Klasse');
erhält man in beiden Fällen die Ausgabe "Klasse". Innerhalb
von "method()" ist da kein Unterschied erkennbar. Die Frage
war aber, wie method() feststellen kann, ob es nun wirklich
als Methode oder als Funktion aufgerufen wurde.
> Sagen wir mal so: Dein Beitrag ist derart unbestimmt, daß es richtig
> und falsch zugleich ist.
Was ist richtig und falsch? Ich habe ja nichts behauptet,
sondern nur etwas gefragt. Und was ist daran "unbestimmt"?
> Umdennoch hilfreich zu sein:
> der Funktionsauruf Test::method(), der ja eigentlich der korrekte
> Funktionsaufruf ist, liefert undef.
Sehr hilfreich ist das nicht. Hast du dir meine Frage genau
durchgelesen? Die Aufrufkonventionen sind unterschiedlich
(einmal mit dem -> Operator als Methode, einmal ohne als
Funktion), aber _innerhalb_ der Funktion kann anhand des
ersten Arguments alleine nicht festgestellt werden, ob sie nun
als Methode oder Funktion aufgerufen wurde. Aber genau
um diese Frage ging es.
> Vielleicht braucht Ihr ja doch noch einen Perl-Programmierer?
Willst du dich bewerben? ;-)
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Aufruf als Methode oder Funktion?
am 21.05.2007 09:33:35 von Ferry Bolhar
Frank Seitz:
> Das ist nicht dasselbe. Die Parameterübergabe ist identisch,
> die Semantik aber unterschiedlich: Im ersten Fall findet
> u.U. eine Methodensuche statt, im zweiten Fall nicht.
Stimmt, aber das kann man ja innerhalb von Methode()
nicht feststellen, oder? Außerdem kann eine solche Suche
stattfinden, muss aber nicht. Das alleine wäre also noch
kein Beweis für den Methodenaufruf.
> > Aber wie kann jetzt "Methode" feststellen,
> > wie sie aufgerufen wurde (dh., mit Objektsyntax und dem
> > "->" Operator, oder normal als Funktion)?
>
> Perl kennt den Unterschied.
Natürlich; die OPs sind andere. Aber was hilft mir das?
> Mal angenommen,
> "Methode" könnte ihn herausfinden. Was hätte "Methode" davon?
o) "Methode" könnte feststellen, ob sie wirklich als Methode
aufgerufen wurde und eine Meldung ausgeben, falls das/falls
das nicht der Fall ist;
o) "Methode" könnte in Abhängigkeit des Aufrufes unterschied-
lich ablaufen bzw. unterschiedliche Ergebnisse zurückliefern.
Mir geht es aber jetzt (noch) nicht um einen konkreten Einsatz,
sondern zunächst nur um die Frage, ob das mit (einfachen)
Mitteln feststellbar ist. Interessant wäre es natürlich auch, wie
man das von XS aus lösen kann. Gibt es eigentlich eine NG,
die sich speziell mit XS-Programmierung beschäftigt?
Schöne Grüße,
Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Aufruf als Methode oder Funktion?
am 21.05.2007 12:23:26 von Frank Seitz
Ferry Bolhar wrote:
> Frank Seitz:
>>
>>Mal angenommen, "Methode" könnte ihn herausfinden.
>>Was hätte "Methode" davon?
>
> o) "Methode" könnte feststellen, ob sie wirklich als Methode
> aufgerufen wurde und eine Meldung ausgeben, falls das/falls
> das nicht der Fall ist;
>
> o) "Methode" könnte in Abhängigkeit des Aufrufes unterschied-
> lich ablaufen bzw. unterschiedliche Ergebnisse zurückliefern.
>
> Mir geht es aber jetzt (noch) nicht um einen konkreten Einsatz,
> sondern zunächst nur um die Frage, ob das mit (einfachen)
> Mitteln feststellbar ist.
Ich bahaupte: Es gibt für diese Information, die Du suchst,
keinen sinnvollen Verwendungszweck. Deswegen ist sie auch
nicht verfügbar.
Genauso gut könntest Du fragen: Wie kann ich in einer Subroutine
feststellen, ob die Argumentliste des Aufrufs geklammert ist?
Klar, Du könntest dann eine Meldung darüber ausgeben,
aber ist dies ein sinnvoller Grund, das wissen zu wollen?
Wenn Dir ein sinnvoller Anwendungsfall einfallen solle,
wäre ich gespannt, den zu hören.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Aufruf als Methode oder Funktion?
am 21.05.2007 12:37:07 von struebig
Ferry Bolhar schrieb:
Das Problem bei der Fragestellung ist ja, wie Frank schon bemerkte,
warum willst das Wissen?
Mal abgesehen davon, dass du die Funktionen von Packages üblicherweise
ja gar nicht so ansprechen kannst, da sie ja über das Package
identifiziert werden müssen.
> 'Klasse'->method();
> method('Klasse');
>
> erhält man in beiden Fällen die Ausgabe "Klasse". Innerhalb
> von "method()" ist da kein Unterschied erkennbar. Die Frage
> war aber, wie method() feststellen kann, ob es nun wirklich
> als Methode oder als Funktion aufgerufen wurde.
Wenn du ein global zugängliche Funktion hast, was willst du dann mit
"Klasse"?
Du hast einfach eine Funktion und dort gibt es in Perl keinen
Unterschied welche Notation du für den ersten Parameter verwendest.
> Sehr hilfreich ist das nicht. Hast du dir meine Frage genau
> durchgelesen? Die Aufrufkonventionen sind unterschiedlich
> (einmal mit dem -> Operator als Methode, einmal ohne als
> Funktion), aber _innerhalb_ der Funktion kann anhand des
> ersten Arguments alleine nicht festgestellt werden, ob sie nun
> als Methode oder Funktion aufgerufen wurde. Aber genau
> um diese Frage ging es.
Der Punkt ist, du kannst eine Klassen Methoden in einem Package nicht
ohne Package aufrufen, d.h. der erste Parameter muss immer entweder das
Package oder eine Referenz auf ein "gesegntes" Package sein, ansonsten
hast du doch keine Klasse?
Struppi.
Re: Aufruf als Methode oder Funktion?
am 21.05.2007 19:08:58 von Ferry Bolhar
Frank Seitz:
> Ich bahaupte: Es gibt für diese Information, die Du suchst,
> keinen sinnvollen Verwendungszweck. Deswegen ist sie auch
> nicht verfügbar.
Sagen wir so: du kannst dir keinen sinnvollen Verwendungszweck
vorstellen, was nicht heißt, dass es ihn nicht vielleicht doch gibt.
Man könnte es als Erweiterung von "strict" sehen - Methoden
sollen eben nur mit der Syntax für Methodenaufrufe aufgerufen
werden, und Funktionen nur als Funktionen. Deklariert man
also z.B.:
sub Methode:method {...}
dann sollte "Methode()" eben auch nur als solche aufgerufen
werden, wozu eben ein derartiger Test gehören würde.
Ich geb' ja zu, dass das Ganze etwas exotisch klingt, aber es
würde mich eben interessieren, ob es generell von XS aus
möglich ist (und falls ja, wie).
> Genauso gut könntest Du fragen: Wie kann ich in einer Subroutine
> feststellen, ob die Argumentliste des Aufrufs geklammert ist?
Das könnte schwieriger werden, weil der Parser nicht benötigte
Klammern entfernt, z.B.:
my $x = sin((((5+$y))));
wird durch dieselben OPs interpretiert, wie
my $x = sin 5 + $y;
Daher kann man schon innerhalb eines BEGIN-Blocks nicht
mehr feststellen, ob und wieviele Klammern verwendet wurden.
Funktions- und Methodenaufrufe hingegen unterscheiden sich
im Opcode (muss ja auch sein, weil in einem Fall Vererbung
greifen kann und im anderen nicht).
Aber OK, lassen wir's gut sein. Ich nehme als Antwort mit,
dass es nicht möglich ist - zumindest nicht mit trivialen Mitteln.
Die Frage wäre ja, ob eine Funktion Zugriff auf jenen OP,
der sie gerade aufgerufen hat, haben kann (d.h., ob und wie
sie feststellen kann, wer der Aufrufer war. Gehen müsste
das schon irgendwie - schließlich gibt es "caller"!).
Schöne Grüße,
Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at