Perl 6 中的 Block
class Block is Code { }
Block 是用于小規(guī)模代碼復(fù)用的代碼對象搔扁。 Block
由花括號括起來的一組語句創(chuàng)建徒爹。
如果沒有顯式的簽名或占位符參數(shù)对妄,那么 Block
會把 $_
作為位置參數(shù):
my $block = { uc $_; };
say $block.WHAT; # (Block)
say $block('hello'); # HELLO
Block
和 ->
或 <->
之間還可以擁有簽名:
my $add = -> $a, $b { $a + $b };
say $add(38, 4); # 42
如果用 <->
引入簽名, 那么參數(shù)默認(rèn)標(biāo)記為 rw
:
my $swap = <-> $a, $b { ($a, $b) = ($b, $a) };
my ($a, $b) = (2, 4);
$swap($a, $b);
say $a; # 4
類型不是 Routine
(它是 Block
的子類)的 Blocks 對于 return是透明的溺职。
sub f() {
say <a b c>.map: { return 42 };
# ^^^^^^ exits &f, not just the block
}
隱式地, 最后一條語句是 Block 的返回值:
say {1}(); # 1
sink 上下文中的裸塊會被自動執(zhí)行:
say 1;
{
say 2; # executed directly, not a Block object
}
say 3;
&?BLOCK
Which block am I in? - 即我所在的塊巢钓。有一個例子:
for '.' {
.Str.say when !.IO.d;
.IO.dir()>>.&?BLOCK when .IO.d # 我們來點遞歸!
}
以上代碼中, 從開括號 {
之后到閉合括號之前的這個花括號是一個 Block
塊, &?BLOCK
表示當(dāng)前 Block 塊, .IO.dir()>>.&?BLOCK
的意思是對于每個遍歷到的目錄/文件都執(zhí)行一次當(dāng)前塊(即花括號)中的代碼, 這樣就使用 Block 達到了遞歸! 好神奇涕滋。