Perl 6 中的 Block

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 圖片
簡(jiǎn)書(shū)支持 SVG 圖片
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容