我定义了一种新的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]
等),但是我想这不是您要问的重点。