web-dev-qa-db-ja.com

Rakuの変数が設定されているかどうかを確認する

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

$barStrに設定された値)から$abcStrに設定された値)を区別するにはどうすればよいですか?

$bar.WHICH == $abc.WHICH、ただし$bar.VAR.WHICH !== $abc.VAR.WHICH、および.definedのようなメソッドがそれぞれに対してfalseを返すことを考えると、設定値があることをすばやく簡単に判断する方法はありますか?

私はそれをデフォルト値に対してチェックできると思っていましたが、値が設定されていないためか、コードで設定されているかを区別する方法はありません。

12
user0721090601

my Str $barmy $bar = Strは同じ結果になります。どちらもStr型ですが、明確な値はありません。 Strはタイプオブジェクトであり、値ではありません。

.defined$barなどの明確な値を指定すると、"Str"Trueを返します(ベアワードを囲む引用符に注意してください)。

2
Tyil

変数を未定義のままにする代わりに、変数にデフォルト値を割り当てようとする場合があります。

 my Str $bar is default("");

$barは、その値タイプが割り当てられている場合にのみStrになります。 Nilを割り当ててその値を削除すると、デフォルトで空の文字列に戻ります。実際には、変数のデフォルトはその型オブジェクトなので、次のようになります。

my Str $foo;
my $bar = Str;
say $foo eqv $bar

実際には、Trueを返します。

0
jjmerelo