Perl 6 中的 Block
class Block is Code { }
Block 是用于小規(guī)模代碼復(fù)用的代碼對(duì)象。 Block
由花括號(hào)括起來(lái)的一組語(yǔ)句創(chuàng)建。
如果沒(méi)有顯式的簽名或占位符參數(shù),那么 Block
會(huì)把 $_
作為位置參數(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 對(duì)于 return是透明的。
sub f() {
say <a b c>.map: { return 42 };
# ^^^^^^ exits &f, not just the block
}
隱式地, 最后一條語(yǔ)句是 Block 的返回值:
say {1}(); # 1
sink 上下文中的裸塊會(huì)被自動(dòng)執(zhí)行:
say 1;
{
say 2; # executed directly, not a Block object
}
say 3;
&?BLOCK
Which block am I in? - 即我所在的塊。有一個(gè)例子:
for '.' {
.Str.say when !.IO.d;
.IO.dir()>>.&?BLOCK when .IO.d # 我們來(lái)點(diǎn)遞歸!
}
以上代碼中, 從開(kāi)括號(hào) {
之后到閉合括號(hào)之前的這個(gè)花括號(hào)是一個(gè) Block
塊, &?BLOCK
表示當(dāng)前 Block 塊, .IO.dir()>>.&?BLOCK
的意思是對(duì)于每個(gè)遍歷到的目錄/文件都執(zhí)行一次當(dāng)前塊(即花括號(hào))中的代碼, 這樣就使用 Block 達(dá)到了遞歸! 好神奇。
簡(jiǎn)書(shū)支持 SVG 圖片