我要把它编辑成my other related question,但感觉不一样,我不想在每个问题上问太多问题。
我的思绪......爆炸了。
考虑:
use strict;
my Int $n = 6;
my Str $x = "a";
my @l = $n, $x;
say @l ~~ List;
按预期打印True
。
然后考虑:
use strict;
my Int $n = 6;
my Str $x = "a";
my List @l = $n, $x; # <-- only change is the type notation
say @l ~~ List;
哪个死了:
Type check failed in assignment to @l; expected List but got Int
所以...列表的类型是列表,但我不能说它的列表,因为这是一个罪恶!
这里发生了什么?这是一个错误吗?或者我将我不相关的Python和Go成语带到Perl并破坏了它们?
答案 0 :(得分:12)
my List @l = $n, $x;
不符合您的想法。它并未声明@l
是List
。它声明@l
的元素将是List
。您不需要声明@l
将是一个数组;当你使用这个印记时,你已经这样做了。
您可以将List
替换为Int
来移动爆炸,以使Perl 6期望Int
的列表。
答案 1 :(得分:10)
my List @l;
是
的简写符号my @l is Array of List;
在数组的元素上放置List
类型约束。
容器上的类型约束已经通过@
sigil表示,对应于角色Positional
,而%
sigil对应于角色Associative
。< / p>
$
变量的情况类似,因为还有一个容器(Scalar
),其单个元素有约束。但是,约束也允许直接重新绑定到去包含值 1 。
1 如果上述内容对您没有意义,您应该研究赋值=
和绑定:=
之间的区别。通过.VAR.WHAT
检查变量也可能是有益的。
请注意,只要其元素在绑定时符合类型约束,我们也可以重新绑定到另一个标量容器。
这可用于破坏类型系统:
my Int $a;
my $b = 42;
$a := $b;
$b = "not cool";
say $a;
不酷:(