我定义了一种新的Tuple类型,如下所示:

subset Tuple of Array where { .elems == 2 && .[0] < .[1] };
my Tuple $t = [1, 2];
say $t;  # [1 2] So far, so good.

我无法使用较短或更长的数组或[2, 1]初始化它,正如预期的那样。但是,我可以附加以下内容:
$t.append(3);
say $t;  # [1 2 3] Ouch!

那怎么可能

最佳答案

my Tuple $t创建一个$t变量,以便对其进行任何(重新)赋值或(重新)绑定(bind)都必须(重新)通过Tuple类型检查。
= [1, 2]分配对Array对象的引用。 Tuple类型检查已应用(并通过)。
$t.append(3)修改Array中保存的$t对象的内容,但不会重新分配或重新绑定(bind)$t,因此不会进行类型检查。

变异方法调用语法-$t.=append(3)而不是$t.append(3)-将触发$t的类型检查。

边界检查数组有特定的语法(my @array[2]等),但是我想这不是您要问的重点。

09-26 22:02
查看更多