BrowserREPL-button-tip-on BrowserREPL-button-tip-off

EditButtonTip 2022-03-21

class Label

Tagged location in the source code

class Label {}
Code

Labels are used in Raku to tag loops so that you can specify the specific one you want to jump to with statements such as last. You can use it to jump out of loops and get to outer ones, instead of just exiting the current loop or going to the previous statement.

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␤»
Code

Those labels are objects of type Label, as shown in the last statement. Labels can be used in any loop construct, as long as they appear right before the loop statement.

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␤»
Code

Putting them on the line before the loop or the same line is optional. Labels must follow the syntax of ordinary identifiers, although traditionally we will use the latin alphabet in uppercase so that they stand out in the source. You can use, however, other alphabets like here:

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

Methods§

method name§

Not terribly useful, returns the name of the defined label:

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

method file§

Returns the file the label is defined in.

method line§

Returns the line where the label has been defined.

method Str§

Converts to a string including the name, file and line it's been defined in.

method next§

method next(Label:)
Code

Begin the next iteration of the loop associated with the label.

MY-LABEL:
for 1..10 {
    next MY-LABEL if $_ < 5;
    print "$_ ";
}

# OUTPUT: «5 6 7 8 9 10 »
Code

method redo§

method redo(Label:)
Code

Repeat the same iteration of the loop associated with the 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 »
Code

method last§

method last(Label:)
Code

Terminate the execution of the loop associated with the label.

MY-LABEL:
for 1..10 {
    last MY-LABEL if $_ > 5;
    print "$_ ";
}

# OUTPUT: «1 2 3 4 5 »
Code

Class relation diagram§

Rakudo Type Relation for Label Label Label Any Any Label->Any is