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 !