web-dev-qa-db-fra.com

Déterminer si une variable dans Raku est définie

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.

12
user0721090601

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).

2
Tyil

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.

0
jjmerelo