PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: class->new() vs. new class()



nidhoegg
03-03-2008, 15:10
Hallo!
Ich arbeite mich gerade in Objekte in Perl ein und habe (nach einiger Zeit des Suchens und Wunderns) folgenden Unterschied beim Konstruktor* eines Objektes entdeckt (was nach meinem Lehrbuch eigentlich das selbe sein sollte):
Konstruiere ich ein Objekt mit $obj = new Klasse (param2, param2), dann läuft alles wie "gewohnt" (Parameter werden dem self->hash zugeordnet).
Rufe ich hingegen $obj = Klasse->new(param1, param2); auf, so wird der Variable $class der erste Parameter zugeordnet, was natürlich zu Fehlern führt.
*) Hier der Konstruktor:


sub new {
my $class = shift;
my $self = {};

$self->{'param_1'} = @_ ;
[...]

bless $self, $class;
return $self;
}

Kann mir jemand den Grund/Sinn dieses Verhaltens erklären?
Viele Grüße,

nidhoegg

reneeb
04-03-2008, 23:58
Also entweder machst Du im Konstruktor noch etwas anderes was den Fehler verursacht (wahrscheinlich) oder Deine Perl-Installation ist aus irgendwelchen Gründen kaputt (eher unwahrscheinlich).

Mein Test:
#!/usr/bin/perl

package Klasse;

sub new {
my $class = shift;
my $self = {};

$self->{'param_1'} = @_ ;
print $class,"\n";

bless $self, $class;
return $self;
}

package main;

my $obj1 = new Klasse ( 'param1', 'param2' );
my $obj2 = Klasse->new( 'param1', 'param2' );

Ausgabe
C:\>class.pl
Klasse
Klasse

Die zweite Schreibweise ist übrigens zu bevorzugen!

jan61
11-03-2008, 20:36
Moin,


...Die zweite Schreibweise ist übrigens zu bevorzugen!

Warum?

Jan

reneeb
15-03-2008, 14:16
Moin,



Warum?

Jan

Probier mal:
#!/usr/bin/perl

sub new($);

my $cgi = new CGI;
print $cgi;

sub new($){
return "hallo";
}

jan61
17-03-2008, 20:40
Moin,

ach so, jetzt isses mir klar. In die Verlegenheit kommt man aber wohl nur, wenn man im eigenen Namensraum eine new-Funktion definiert. Hast aber recht, sicherer ist dann immer die Variante Klasse->new().

Jan

reneeb
19-03-2008, 18:36
Moin,

ach so, jetzt isses mir klar. In die Verlegenheit kommt man aber wohl nur, wenn man im eigenen Namensraum eine new-Funktion definiert.

Jein, es kann gibt ja auch Module, die Funktionen in den aufrufenden Namensraum exportieren.

jan61
20-03-2008, 20:54
Moin,


Jein, es kann gibt ja auch Module, die Funktionen in den aufrufenden Namensraum exportieren.

hm, ein Modul, das new() exportiert, das sollte wohl erschossen werden - bzw. der Programmierer geteert und gefedert ;-)

cu
Jan

reneeb
21-03-2008, 10:30
hm, ein Modul, das new() exportiert, das sollte wohl erschossen werden - bzw. der Programmierer geteert und gefedert ;-)


richtig ;-)