当我们使用超出数组边界的索引对数组进行切片时,我们会得到未定义 (Any)
当我们将相同的切片索引作为惰性列表传递时,我们会得到数组/列表的现有值(仅此而已):
my @a = ^5;
say @a[^10]; # (0 1 2 3 4 (Any) (Any) (Any) (Any) (Any))
say @a[lazy ^10]; # (0 1 2 3 4)
很明显,切片索引的惰性会影响结果。
试图理解事物的本来面目,作为概念证明,我编写了切片机制的简单版本:
my @a = ^5;
my @s1 = ^10;
my @s2 = lazy ^10;
sub postcircumfix:<-[ ]-> (@container, @index) {
my $iter = @index.iterator;
gather {
loop {
my $item := $iter.pull-one;
if $item =:= IterationEnd {
last;
}
with @container[$item] {
take @container[$item]
} else {
@index.is-lazy ?? { last } !! take @container[$item];
}
}
}
}
say @a-[@s1]-; # (0 1 2 3 4 (Any) (Any) (Any) (Any) (Any))
say @a-[@s2]-; # (0 1 2 3 4)
但我想知道我的幼稚算法是否描述了事物在幕后计算的方式!