" travaille-t-il de manière interchangeable lors des méthodes d'appel des modules Perl? - Retrouvez les réponses et les commentaires concernant cette question" />
Je continue à obtenir Je suis à propos de vous accéder à des modules, mais je suis toujours sur des terrains vacillants en ce qui concerne les objets Perl, mais j'ai accidentellement fait cela: P > :: code> confondu avec
-> code> lorsque vous appelez les sous-routines à partir de modules. Je sais que
:: code> est plus lié aux chemins et où le module / le sous-programme est et
-> code> est utilisé pour les objets, mais je ne comprends pas vraiment pourquoi je peux apparemment échanger les deux et il ne propose pas d'erreurs immédiates.
J'ai des modules Perl faisant partie d'un package plus grand, par exemple
FullProgram :: Part1 Code>
FullProgram::Part1->subroutine1();
4 Réponses :
sub method { my ($self, $foo, $bar) = @_; $self->do_something_with($bar); # ... }
$ Object-> Méthode (@args) Code> Ne "appelle simplement Classe :: Méthode". Il appelle la première méthode nommée
méthode code> trouvée dans l'arborescence d'héritage.
Essayé de mentionner ce sujet sans faire ma réponse trop complexe et supprimé le "juste". Merci, @ikegami!
Il n'y a pas de différence inhérente entre un sous-vanille et son est une méthode. Tout est dans la façon dont vous l'appelez.
ceci appellera C'est à peu près la même chose que: Ceci appellera C'est à peu près le même que: classe :: foo code>. Si
classe :: FOO code> n'existe pas, l'arborescence d'héritage ne sera pas vérifiée.
Classe :: FOO code> sera transmis uniquement les arguments fournis (
'A' code>). p>
My $ SUB = \ & Classe :: foo; $ sub -> ('a'); code> p>
classe :: FOO code> ou
FOO code> dans l'une de ses classes de base si
classe :: FOO code> n'existe pas. L'invocant (ce qui se trouve à gauche du
-> code>) sera transmis comme un argument. P>
My $ SUB = classe-> peut ('foo'); $ sub -> ('classe', 'a'); code> p> p>
Historiquement, Perl n'a eu aucun oo. Et fonctionne des packages appelés Plus tard, ils ont mis en œuvre OOP avec Offtop: Vous pouvez également appeler avec FullProgram :: Part1 :: Subroutin1 (); Code> Sytax. Ou même avant avec
FULLPROGRAM'PART1'SUBROUTINE1 (); code> Syntaxe (obsolète). P>
-> code> signe, mais ne changez pas trop.
FullProgram :: Part1-> SUBROUTINE1 (); CODE> Appels
SUBROUTINE1 CODE> et
FULLPRODROGRAME :: Part1 CODE> va sous le 1er paramètre. Vous pouvez voir l'utilisation de cela lorsque vous créez un objet:
My $ cgi = cgi-> nouveau () code>. Maintenant, lorsque vous appelez une méthode à partir de cet objet, la partie gauche va également comme premier paramètre à fonctionner:
$ cgi-> paramore ('') code>. Thats comment
param code> obtient l'objet qu'il a appelé (généralement nommé
$ auto code>). C'est ça.
-> code> est le piratage pour OOP. Ainsi, par conséquent, Perl n'a pas de cours (les packages fonctionnent comme eux) mais ont des objets ("objets" hacks aussi - ils sont des scalaires bénis). P>
My $ CGI = nouveau CGI; code> Syntaxe. C'est la même chose que
cgi-> nouveau code>. Idem quand vous dites
imprimer stdout "text \ n"; code>. Ouais, juste appeler juste
iohandle :: print () code>. P>
Il convient également de mentionner que -> code> provoque la recherche de l'arborescence d'héritage (encore un autre hack via
@isa code>).
Utilisez les deux!
Module::Two()->class_method();
L'ambiguïté d'analyse exprimée ici est l'une de mes choses "favorites" sur Perl. Le fait que la solution de contournement soit si laid me rend triste.
@ Darch: Je ne pense pas que ce soit moche. Que pensez-vous de "module :: deux" -> class_method () code>?
Quelques bonnes réponses, difficiles à choisir, mais merci - définitivement effacé les choses!