以下のようなコードは「あー、にるい」が出力されそうですが、実際に実行してみると出力されません。
my $puyo = Nil;
say 'あー、にるい' if $puyo ~~ Nil;
なぜこうなるのかをこれから解説します。
例えば、以下のように変数を宣言すると、 $puyo
のデフォルト値は (Any)
となります。
my $puyo = Nil;
これは、以下のように宣言したのと等価です:
my $puyo is default((Any)) = Nil;
Nil
は値が存在しないことを表します。
デフォルト値が (Any)
になっている変数に Nil
を設定すると、変数の値は (Any)
になります。
ここで、 (Any)
と Nil
とは異なる値なので、 $puyo ~~ Nil
は False
を返します。
なので、デフォルト値を Nil
にすれば、最初のコードがうまくいきそうに思えます。
my $puyo is default(Nil) = Nil;
say 'あー、にるい' if $puyo ~~ Nil;
実行してみると、出力されます。やりました。
$ raku ./feeling-nilly001.raku あー、にるい
でも、いつも is default(Nil)
を指定するのは面倒です。
そこで、ある変数の中に無効な値が入っているかどうかを調べるため、 .defined
メソッドを使います。
my $puyo = Nil;
say 'あー、にるい' unless $puyo.defined;
また、ジャンクションを使うという手もあります:
my $puyo = Nil;
say 'あー、にるい' if Nil ~~ one($puyo);