Perl6 匿名副程式和 Blocks/Pointy Blocks 的差別

Home » Perl6 » Perl6入門 » Perl6 匿名副程式和 Blocks/Pointy Blocks 的差別
2015-08-02 Perl6入門 尚無留言

Blocks 和 Pointy Blocks(即 { } 和 -> { })雖然也能傳入參數,但畢竟它不是副程式,沒有函式的環境(function context),也就是說:若在 block 中有 return 的話,它會由父函式立即返回,父函式因此停止執行,如下例:

sub test-in(@array, $elt) {
   # 若 $elt 在陣列中,則執行 return
   map({ say $_; return True if $elt == $_ }, @array); 
}
my @a = 1, 2, 3;
test-in(@a, 1); # 判斷陣列中是否有元素為 1

# => 結果:
# 1 (因為傳入陣列中有 1,所以 map 立即停止,2 和 3 不會再做映射)

但匿名副程式則不然,sub 中的 return 只會結束 sub 本身,父函式 test-in 仍會繼續執行:

sub test-in(@array, $elt) {
   map(sub ($x) { say $x; return True if $elt == $x }, @array);
}

my @a = 1, 2, 3;
test-in(@a, 1);

# => 結果:
# 1
# 2
# 3

LEAVE A COMMENT

  −  three  =  three

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料