11 votes

Utilisation de méthodes publiques et privées à l'intérieur de leur classe en Perl 6

Si j'ai une méthode publique, je peux l'appeler à l'intérieur de sa classe en utilisant les deux méthodes suivantes $.name y self.name :

class TEST {
  has Int $.a;

  method b($x) {
    return $!a * $x;
  }

  method c($y) {
    return self.b($y) * 3; # or $.b($y)
  }
}

my $m = TEST.new(a => 10);
say $m.c(2); # 60

Mais si je fais b une méthode privée, je peux seulement l'appeler avec self!b no $!b sinon je reçois le message d'erreur suivant :

Attribute $!b not declared in class TEST

Qu'est-ce qui se cache derrière cette règle ? Quelles sont les règles d'appel d'une méthode à l'intérieur de sa propre classe ?

10voto

Elizabeth Mattijsen Points 9294

Un attribut peut toujours être désigné comme $!foo dans une classe. Si vous faites cela, alors le code sera généré pour accéder directement à l'attribut lui-même, et toutes les classes qui sous-classent votre classe seront no être en mesure de modifier ce comportement.

Si vous utilisez has $.foo dans la déclaration d'une classe, cela signifie qu'un accesseur public (et si vous ajoutez is rw il peut également fonctionner comme un mutateur).

Lorsque vous utilisez $.foo dans votre code sinon, c'est exactement la même chose que $( self.foo ) . Cela signifie qu'il appellera la méthode foo sur self et détailler la valeur de retour (en faire une seule "chose" si ce n'était pas encore le cas). Cela se passera mal si vous avez défini votre attribut avec $!foo et vous n'avez pas fourni un method foo vous-même.

Cela va même plus loin : $.bar signifie vraiment self.bar : il suffit d'avoir une méthode existant sous le nom de bar qui peut ne pas être lié à un quelconque attribut.

Si vous définissez une méthode privée !baz le ! indique simplement le caractère privé de la méthode, ce qui signifie que vous devez l'appeler effectivement en tant que self!baz . Il y a pas de une courte syntaxe pour cela.

Personnellement, je n'aime pas le fait que vous pouvez dire $.zippo même si zippo n'est pas un attribut. Mais j'ai bien peur que ce bateau ait coulé. Mais ce comportement est maintenant source de confusion pour vous :-(

Alors qu'est-ce qui se cache derrière la règle de ne pas avoir de syntaxe courte pour appeler une méthode privée ? Je ne suis pas sûr, je suppose que $!foo était déjà considéré comme un accès direct à l'attribut, et vous fournissait une erreur de compilation si l'attribut n'existait pas.

J'espère que cela répond à votre question !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X