Schrift
[thread]6706[/thread]

Tipps um Module zu schreiben: was gibt es zu beachten, oop oder nicht? (Seite 2)

Leser: 2


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Crian
 2005-02-15 18:18
#51721 #51721
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
In Perl bekommst Du $self zwar immer in Methoden übergeben, aber nicht irgendwie benannt, sondern als erstes Element von @_. Es steht Dir also frei es anders zu nennen.

Sinniger Weise nennt man es aber überall $self.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-02-15 19:27
#51722 #51722
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=deepblack,15.02.2005, 16:58]
Code: (dl )
1
2
3
4
5
6
sub new {
       my $class = shift;
...
       bless($self,$class);
...
}

... 'attempt to bless into reference..' ...[/quote]
Diese Fehlermeldung kannst du eigentlich nur bekommen, wenn $class eine Referenz ist, d.h. du musst new irgendwie folgendermaszen aufgerufen haben:
Code: (dl )
my $object = $irgendwas->new();

ein konstruktor erwartet als ersten parameter aber die klasse und kein objekt, also
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
package MyClass;
sub new {
  my $class = shift;
  my $self = {}; # usw
  bless($self, $class);
  return $self;
}
package main;
my $object = MyClass->new(...);

Das mit dem
Code (perl): (dl )
1
2
3
my $this = shift;
my $class = ref($this) || $this;
my $self = {};

brauchst du nur, wenn du willst, dass dein konstruktor sowohl mit $object->new (zum klonen) als auch MyClass->new aufgerufen werden soll; wenn du wirklich eine Klonfunktion brauchst, dann ist es besser, wenn du sie auch ->clone oder so aehnlich nennst; wenn du sowas doch umbedingt machen willst, dann schlage ich vor, es folgendermaszen zu machen:
Code (perl): (dl )
1
2
3
4
sub new {
  my $proto = shift;
  my $class = ref($proto) || $proto; # Cargo Cult Programming
  ...
\n\n

<!--EDIT|Strat|1108488625-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2005-02-15 19:34
#51723 #51723
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Und was ist an proto besser als an ref? *amkopfkratz*
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-02-15 19:44
#51724 #51724
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
$proto ist besser als $this, weil es so in perldoc steht... aber die entscheidende verbesserung ist der kommentar ;-)\n\n

<!--EDIT|Strat|1108489487-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2005-02-16 15:52
#51725 #51725
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Hmm... ich hab das mit $ref gelernt =)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-02-16 22:51
#51726 #51726
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
$ref finde ich ungeschickt, weil ja eben beim normalen Konstruktor die Klasse, also keine Referenz uebergeben wird... aber irgendwie finde ich da alles ungeschickt... hochstens
Code: (dl )
my $class = ref($_[0]) || $_[0];

aber das finde ich haesslich... und wenn noch weitere parameter kommen, auch ungeschickt...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2005-02-15 16:33.