" 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" />
8
votes

Pourquoi "::" et "->" travaille-t-il de manière interchangeable lors des méthodes d'appel des modules Perl?

Je continue à obtenir :: 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>

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 >

FullProgram::Part1->subroutine1();


1 commentaires

Quelques bonnes réponses, difficiles à choisir, mais merci - définitivement effacé les choses!


4 Réponses :


7
votes
sub method {
    my ($self, $foo, $bar) = @_;
    $self->do_something_with($bar);
    # ...
}

2 commentaires

$ Object-> Méthode (@args) Ne "appelle simplement Classe :: Méthode". Il appelle la première méthode nommée méthode 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!



9
votes

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.


xxx

ceci appellera classe :: foo . Si classe :: FOO n'existe pas, l'arborescence d'héritage ne sera pas vérifiée. Classe :: FOO sera transmis uniquement les arguments fournis ( 'A' ).

C'est à peu près la même chose que: My $ SUB = \ & Classe :: foo; $ sub -> ('a');


xxx

Ceci appellera classe :: FOO ou FOO dans l'une de ses classes de base si classe :: FOO n'existe pas. L'invocant (ce qui se trouve à gauche du -> ) sera transmis comme un argument.

C'est à peu près le même que: My $ SUB = classe-> peut ('foo'); $ sub -> ('classe', 'a');


0 commentaires

0
votes

Historiquement, Perl n'a eu aucun oo. Et fonctionne des packages appelés FullProgram :: Part1 :: Subroutin1 (); Sytax. Ou même avant avec FULLPROGRAM'PART1'SUBROUTINE1 (); Syntaxe (obsolète).

Plus tard, ils ont mis en œuvre OOP avec -> signe, mais ne changez pas trop. FullProgram :: Part1-> SUBROUTINE1 (); Appels SUBROUTINE1 et FULLPRODROGRAME :: Part1 va sous le 1er paramètre. Vous pouvez voir l'utilisation de cela lorsque vous créez un objet: My $ cgi = cgi-> nouveau () . Maintenant, lorsque vous appelez une méthode à partir de cet objet, la partie gauche va également comme premier paramètre à fonctionner: $ cgi-> paramore ('') . Thats comment param obtient l'objet qu'il a appelé (généralement nommé $ auto ). C'est ça. -> 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).

Offtop: Vous pouvez également appeler avec My $ CGI = nouveau CGI; Syntaxe. C'est la même chose que cgi-> nouveau . Idem quand vous dites imprimer stdout "text \ n"; . Ouais, juste appeler juste iohandle :: print () .


1 commentaires

Il convient également de mentionner que -> provoque la recherche de l'arborescence d'héritage (encore un autre hack via @isa ).



5
votes

Utilisez les deux!

Module::Two()->class_method();


2 commentaires

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 () ?