我已经定义了一个新类型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)
怎么可能?
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]等)有特定的语法,但我猜这不是你问题的重点.
类型约束绑定到标量容器,但它包含的对象只是一个普通的旧数组 - 并且数组的append方法不知道您希望它触发类型检查。
如果您想再次显式触发检查,您可以执行类似的重新分配$t = $t。
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |