J'évite intentionnellement le terme defined
car une variable peut très bien avoir une valeur définie mais le .defined
La méthode retournera false (échecs, par exemple).
Existe-t-il un moyen de déterminer si une variable a une valeur définie?
my $foo;
say $foo; # (Any), its type object, no value assigned
my Str $bar;
say $bar; # (Str), its type object, no value assigned
my $abc = Str;
say $abc; # (Str), the type object we assigned to $abc
Comment pouvons-nous distinguer $bar
(aucune valeur définie, saisie comme Str
) à partir de $abc
(valeur définie sur Str
)?
Étant donné que $bar.WHICH == $abc.WHICH
, mais $bar.VAR.WHICH !== $abc.VAR.WHICH
et des méthodes comme .defined
renverra false pour chacun, existe-t-il un moyen rapide et facile de déterminer qu'il existe une valeur définie?
J'ai supposé qu'elle pouvait être vérifiée par rapport à la valeur par défaut, mais il n'y aurait alors aucun moyen de faire la distinction entre la valeur étant en vertu de unset, et en étant définie dans le code.
my Str $bar
et my $bar = Str
aboutit à la même chose, les deux sont de type Str mais n'ont pas de valeurs définies. Str
est un objet de type, pas une valeur.
.defined
renverrait True
si vous donniez $bar
une valeur définie, telle que "Str"
(notez les citations entourant le mot nu).
Vous pouvez essayer d'attribuer une valeur par défaut à une variable, au lieu de la garder indéfinie:
my Str $bar is default("");
$bar
sera Str
uniquement si ce type de valeur lui est attribué; si sa valeur est supprimée en affectant Nil
, elle reviendra par défaut à la chaîne vide. En fait, la valeur par défaut d'une variable est son objet de type, donc:
my Str $foo;
my $bar = Str;
say $foo eqv $bar
va, en fait, retourner True.