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
