class Block is Code { }

Block 是一个用于小规模代码重用的代码对象。块在语法上由用大括号括起来的一系列语句创建。创建空块的字面量是 {;}

如果没有显式签名或占位符参数,块将 $_ 作为位置参数,默认值为外部范围的 $_。因此,如果有的话,它将继承 主题

my $block = { uc $_};
say $block.^name;           # OUTPUT: «Block␤» 
say $block('hello');        # OUTPUT: «HELLO␤» 
say {;}.signature;          # OUTPUT: «(;; $_? is raw = OUTER::<$_>)␤»

块可以在 -><-> 和块之间具有 Signature

my $add = -> $a$b = 2 { $a + $b };
say $add(40);               # OUTPUT: «42␤»

如果签名是用 <-> 引入的,则参数默认情况下被标记为 rw

my $swap = <-> $a$b { ($a$b= ($b$a};
my ($a$b= (24);
$swap($a$b);
say $a;                     # OUTPUT: «4␤»

不是 Routine 类型(它是 Block 的子类)的块对 return 是透明的。

sub f() {
    say <a b c>.map: { return 42 };
                   #   ^^^^^^   exits &f, not just the block 
}

最后一个语句是块的隐式返回值。

say {1}.(); # OUTPUT: «1␤»

裸块会按照它们出现的顺序自动执行。

say 1;                # OUTPUT: «1␤» 
{
    say 2;            # OUTPUT: «2␤»; executed directly, not a Block object 
}
say 3;                # OUTPUT: «3␤»

类型图§

Block 的类型关系
raku-type-graph Block Block Code Code Block->Code Mu Mu Any Any Any->Mu Callable Callable Code->Any Code->Callable Routine Routine Routine->Block Macro Macro Macro->Routine Sub Sub Sub->Routine Method Method Method->Routine Submethod Submethod Submethod->Routine Regex Regex Regex->Method

展开上面的图表