为什么Perl6在追加后不检查数组长度?

cho*_*oba 9 types perl6 raku

我已经定义了一个新类型Tuple如下:

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

我无法使用更短或更长的阵列或[2, 1]正如预期的那样初始化它.但是,我可以补充一下:

$t.append(3);
say $t;  # [1 2 3] Ouch!
Run Code Online (Sandbox Code Playgroud)

怎么可能?

rai*_*iph 6

my Tuple $t创建一个$t变量,以便任何(重新)赋值或(重新)绑定它必须(重新)传递Tuple类型检查.

= [1, 2]分配Array对象的引用.的Tuple类型检查施加(并通过).

$t.append(3)修改Array保留的对象的内容$t但不重新分配或重新绑定,$t因此没有类型检查.

Mutating-method-call语法 - $t.=append(3)而不是$t.append(3)- 将触发类型检查$t.

边界检查数组(my @array[2]等)有特定的语法,但我猜这不是你问题的重点.


Chr*_*oph 4

类型约束绑定到标量容器,但它包含的对象只是一个普通的旧数组 - 并且数组的append方法不知道您希望它触发类型检查。

如果您想再次显式触发检查,您可以执行类似的重新分配$t = $t