在 Supply 中§

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

method skip(Supply:D: Int(Cool$number = 1 --> Supply:D)

返回一个新的 Supply,它将发出给定 Supply 的所有值,但前 $number 个值除外,这些值将被丢弃。

my $supplier = Supplier.new;
my $supply = $supplier.Supply;
$supply = $supply.skip(3);
$supply.tap({ say $_ });
$supplier.emit($_for 1..10# OUTPUT: «4␤5␤6␤7␤8␤9␤10␤» 

在 Any 中§

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

multi method skip()
multi method skip(Whatever)
multi method skip(Callable:D $w)
multi method skip(Int() $n)
multi method skip($skip$produce)

从 1 项列表的迭代器创建一个 Seq,并在其上使用 Seq.skip,请查看该文档以了解实际用例;不带参数调用 skip 等效于 skip(1)

multi skip(\skipper+values)

从 Rakudo 编译器的 2022.07 版本开始,还有一个“sub”版本的 skip。它必须将 skip 说明符作为第一个参数。其余参数将转换为 Seq,然后在其上调用 skip 方法。

在模块 Test 中§

请参阅上下文中的主要文档,了解 sub skip

multi skip()
multi skip($reason$count = 1)

跳过 $count 个测试,并给出跳过原因 $reason。默认情况下,只会跳过一个测试。当一个(或多个)测试在运行时会失败时,请使用此功能。

sub num-forward-slashes($arg{ ... } ;
 
if $*KERNEL ~~ 'linux' {
    is num-forward-slashes("/a/b"),             2;
    is num-forward-slashes("/a//b".IO.cleanup), 2;
}
else {
    skip "Can't use forward slashes on Windows"2;
}

请注意,如果您将测试标记为跳过,则还必须阻止该测试运行。

在 Seq 中§

请参阅上下文中的主要文档,了解 method skip

multi method skip(Seq:D:)
multi method skip(Seq:D: Whatever)
multi method skip(Seq:D: Callable:D $w)
multi method skip(Seq:D: Int() $n)
multi method skip(Seq:D: $skip$produce)

返回一个 Seq,其中包含在丢弃接下来的 $n 个可用值后调用方的剩余部分。$n 的负值计为 0。也可以使用 WhateverCode 来指示要从末尾跳过多少个值。将阻塞惰性 Seq,直到丢弃请求数量的值。

say (1..5).Seq.skip;      # OUTPUT: «(2 3 4 5)␤» 
say (1..5).Seq.skip(3);   # OUTPUT: «(4 5)␤» 
say (1..5).Seq.skip(5);   # OUTPUT: «()␤» 
say (1..5).Seq.skip(-1);  # OUTPUT: «(1 2 3 4 5)␤»

使用 Whatever 调用它将返回一个空的 Seq

say <1 2 3>.Seq.skip(*);  # OUTPUT: «()␤»

使用 Callable 的多重调用主要用于以下方式

say (1..5).Seq.skip(*-3); # OUTPUT: «(3 4 5)␤»

它不会丢弃前 $n 个元素,而是丢弃除 WhateverCode 指示的元素之外的所有元素,在本例中是除最后三个元素之外的所有元素。

从语言版本 6.e 开始(Rakudo 编译器 2022.12+ 中存在早期实现),还可以指定多个参数值。然后将这些值解释为要生成的数值、要跳过的数值、要生成的数值,等等。

say (1..12).Seq.skip(2,3,4); # OUTPUT: «(3 4 5 10 11 12)␤»

这首先跳过了 2 个值,然后生成了 3 个值(3、4、5),跳过了 4 个值,然后生成了其余的值(10、11、12)。

如果指定的最终值位于“生成”位置,则将跳过 Seq 的其余部分。如果最终值位于“跳过”位置,则将生成 Seq 的其余部分。

say (1..10).Seq.skip(2,3,1,2); # OUTPUT: «(3 4 5 7 8)␤» 
say (1..10).Seq.skip(2,3,1);   # OUTPUT: «(3 4 5 7 8 9 10)␤»

如果在“生成”位置指定了 Whatever,则将导致生成 Seq 的其余部分。否则,将导致跳过 Seq 的其余部分。

say (1..10).Seq.skip(2,*);   # OUTPUT: «(3 4 5 6 7 8 9 10)␤» 
say (1..10).Seq.skip(2,3,*); # OUTPUT: «(3 4 5)␤»

如果要从生成值而不是跳过值开始,请指定 0 作为第一个值。

say (1..10).Seq.skip(0,3,4); # OUTPUT: «(1 2 3 8 9 10)␤»

如果需要一个无限重复的跳过和生成模式,可以将参数指定为一个无限的 Seq

say (^20).Seq.skip(|(2,3xx *); # OUTPUT: «(0 1 5 6 10 11 15 16)␤»