class Label {}

Raku 中使用标签标记循环,以便您可以使用 诸如 last 的语句指定要跳转到的特定循环。您可以使用它跳出循环并进入外部循环,而不仅仅是退出当前循环或转到前一条语句。

USERS:          # the label 
for @users -> $u {
    for $u.pets -> $pet {
        # usage of a label 
        next USERS if $pet.barks;
    }
    say "None of {$u}'s pets barks";
}
say USERS.^name;        # OUTPUT: «Label␤» 

这些标签是 Label 类型的对象,如最后一条语句所示。只要标签出现在循环语句之前,就可以在任何循环结构中使用它们。

my $x = 0;
my $y = 0;
my $t = '';
A: while $x++ < 2 {
    $t ~= "A$x";
    B: while $y++ < 2 {
        $t ~= "B$y";
        redo A if $y++ == 1;
        last A
    }
}
say $t# OUTPUT: «A1B1A1A2␤» 

将它们放在循环之前或同一行是可选的。Label 必须遵循 普通标识符 的语法,尽管传统上我们会使用大写的拉丁字母,以便它们在源代码中脱颖而出。但是,您可以使用其他字母,如下所示

駱駝道: while True {
  say 駱駝道.name;
  last 駱駝道;
}  # OUTPUT: «駱駝道␤»

方法§

方法名称§

不太有用,返回已定义标签的名称

A: while True {
  say A.name# OUTPUT: «A␤» 
  last A;
}

方法文件§

返回定义标签的文件。

方法行§

返回定义标签的行。

方法 Str§

转换为一个字符串,其中包括名称、文件和定义它的行。

方法 next§

method next(Label:)

开始与标签关联的循环的下一个迭代。

MY-LABEL:
for 1..10 {
    next MY-LABEL if $_ < 5;
    print "$_ ";
}
 
# OUTPUT: «5 6 7 8 9 10 »

方法 redo§

method redo(Label:)

重复与标签关联的循环的相同迭代。

my $has-repeated = False;
 
MY-LABEL:
for 1..10 {
    print "$_ ";
    if $_ == 5 {
        LEAVE $has-repeated = True;
        redo MY-LABEL unless $has-repeated;
    }
}
 
# OUTPUT: «1 2 3 4 5 5 6 7 8 9 10 »

方法 last§

method last(Label:)

终止与标签关联的循环的执行。

MY-LABEL:
for 1..10 {
    last MY-LABEL if $_ > 5;
    print "$_ ";
}
 
# OUTPUT: «1 2 3 4 5 »

类型图§

Label 的类型关系
raku-type-graph Label Label Any Any Label->Any Mu Mu Any->Mu

展开上面的图表