defined
という用語は意図的に避けています。これは、変数に値が定義されていても、.defined
メソッドはfalseを返すためです(たとえば、失敗)。
変数に値が設定されているかどうかを確認する方法はありますか?
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
$bar
(Str
に設定された値)から$abc
(Str
に設定された値)を区別するにはどうすればよいですか?
$bar.WHICH == $abc.WHICH
、ただし$bar.VAR.WHICH !== $abc.VAR.WHICH
、および.defined
のようなメソッドがそれぞれに対してfalseを返すことを考えると、設定値があることをすばやく簡単に判断する方法はありますか?
私はそれをデフォルト値に対してチェックできると思っていましたが、値が設定されていないためか、コードで設定されているかを区別する方法はありません。
my Str $bar
とmy $bar = Str
は同じ結果になります。どちらもStr型ですが、明確な値はありません。 Str
はタイプオブジェクトであり、値ではありません。
.defined
に$bar
などの明確な値を指定すると、"Str"
はTrue
を返します(ベアワードを囲む引用符に注意してください)。
変数を未定義のままにする代わりに、変数にデフォルト値を割り当てようとする場合があります。
my Str $bar is default("");
$bar
は、その値タイプが割り当てられている場合にのみStr
になります。 Nil
を割り当ててその値を削除すると、デフォルトで空の文字列に戻ります。実際には、変数のデフォルトはその型オブジェクトなので、次のようになります。
my Str $foo;
my $bar = Str;
say $foo eqv $bar
実際には、Trueを返します。