在Scalar容器所保持的值爲不自動迭代
雖然兩者$s
和$seq
是scalars(又名「變量」),$s
直接綁定到一個序列值,而你的$seq
綁定到一箇中間人Scalar(注意大寫S
)「容器」,其中包含Seq。在使用for
等功能時,標量容器中保存的值爲而不是。
更詳細地:
my $s := 0 ... 3;
.say for $s;
由於my
變量聲明使用用於初始化的直接結合操作者:=
,$s
是直接綁定到單個SEQ值0 ... 3
。
這意味着for
語句看到單個Seq值,確定它執行Iterable角色並將其平滑(迭代)。
現在考慮這個:
my $s := 0 ... 3;
my $container = $s;
.say for $container;
由於第二my
聲明使用初始化賦值運算符=
,新的變量$container
首先必然然後「包含」任何被分配一個新的標容器。
與語言保持寬Slurpy Conventions(特別是:「一個標量容器內可迭代不計」),一個for
語句不重複在一個標量容器內的值,所以.say for $container
線只做一say
。
類似的情況適用於您的原始show
例程,因爲可變參數聲明默認情況下是(語義)容器。
一個選項是一個is raw
性狀而不是添加到$seq
參數:
sub show ($seq is raw) { .say for $seq }
這防止$seq
通常的自動綁定到一個標量容器(這反過來將包含SEQ值)作爲其一部分致電show
。
另一種選擇是讓$seq
使用前綴|
被綁定到一個標量容器,但明確地變平(迭代)的$seq
變量在show
例程的主體:
sub show ($seq) { .say for |$seq }
Thanks!但是,我正在考慮無限的懶序列。 :) –