在数组中§

有关例程 splice,请参阅上下文中的主要文档

multi        splice(@list,   $start = 0$elems?*@replacement --> Array)
multi method splice(Array:D: $start = 0$elems?*@replacement --> Array)

从索引 $start 开始删除 $elems 个元素,返回它们并用 @replacement 替换它们。如果省略 $elems 或其大于从 $start 开始的元素数量,则删除从索引 $start 开始的所有元素。如果省略 $start$elems,则删除 Array 中的所有元素并返回。

$start$elems 每个都可以指定为 WhateverCallable,后者返回 Int 兼容值:然后将此返回值用作 splice 例程的相应参数。

Whatever $start 使用 @list(或调用者)的元素数量。Callable $start 使用一个参数调用——@list(或 self)中的元素数量。

Whatever $elems$start 删除到 @list(或 self)的末尾(与没有 $elems 相同)。Callable $elems 使用一个参数调用——@list(或 self)中的元素数量减去 $start 的值。

示例

my @foo = <a b c d e f g>;
say @foo.splice(23, <M N O P>);        # OUTPUT: «[c d e]␤» 
say @foo;                                # OUTPUT: «[a b M N O P f g]␤»

它可用于通过简单地拼接比当前大小更多的元素来扩展数组(自版本 6.d 起)

my @foo = <a b c d e f g>;
say @foo.splice(64, <M N O P>);       # OUTPUT: «[g]␤» 
say @foo;                               # OUTPUT: «[a b c d e f M N O P]␤» 

以下等价关系成立(假设 @a.elems ≥ $i

@a.push($x, $y)      @a.splice: *  , *, $x, $y
@a.pop               @a.splice: *-1,
@a.shift             @a.splice: 0  , 1,
@a.unshift($x, $y)   @a.splice: 0  , 0, $x, $y
@a[$i] = $y          @a.splice: $i , 1, $y,

如上所述,可以为 $start$elems 参数提供 WhateverCallable 对象。例如,我们可以使用其中任何一个从数组中删除倒数第二个元素,前提是数组足够大以包含一个元素

my @foo = <a b c d e f g>;
say @foo.splice: *-2*-1;           # OUTPUT: «[f]␤» 
say @foo;                            # OUTPUT: «[a b c d e g]␤» 
 
my &start     = -> $n { $n - 2 };
my &elems-num = -> $m { $m - 1 };
say @foo.splice: &start&elems-num# OUTPUT: «[e]␤» 
say @foo;                            # OUTPUT: «[a b c d g]␤»

在角色 Buf 中§

有关方法 splice,请参阅上下文中的主要文档

method spliceBuf:D: $start = 0$elems?*@replacement --> Buf)

用其他元素替换缓冲区的元素,返回一个包含已删除元素的缓冲区。

my $ = Buf.new11235 );
say $.splice:  03, <3 2 1>;  # OUTPUT: «Buf:0x<01 01 02>␤» 
say $.raku;                    # OUTPUT: «Buf.new(3,2,1,3,5)␤»