我本来会把它编辑成我的其他相关问题,但感觉不一样,我不想在每个问题上问太多问题.
我的思绪......爆炸了.
考虑:
use strict;
my Int $n = 6;
my Str $x = "a";
my @l = $n, $x;
say @l ~~ List;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
哪个死了:
Type check failed in assignment to @l; expected List but got Int
Run Code Online (Sandbox Code Playgroud)
所以...列表的类型是列表,但我不能说它是列表,因为这是一个罪!
这里发生了什么?这是一个错误吗?或者我将我不相关的Python和Go成语带到Perl并破坏事物?
dar*_*rch 12
my List @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)
不会做你认为它做的事情.它没有声明那@l是一个List.它宣称@l将是Lists 的元素.你不需要声明@l它将是一个数组; 当你使用这个印记时,你已经这样做了.
您可以通过替换来移动爆炸List,Int以使Perl 6期望Ints 列表.
Chr*_*oph 10
my List @l;
Run Code Online (Sandbox Code Playgroud)
是简写符号
my @l is Array of List;
Run Code Online (Sandbox Code Playgroud)
它对数组List的元素设置了类型约束.
容器上的类型约束已经通过@sigil 表示,对应于角色Positional,而%sigil对应于角色Associative.
的情况下,$变量是只要类似也有涉及(的容器Scalar,其单个元件上的约束).但是,约束也允许直接重新绑定到去包含的值1.
1如果上述内容对您没有意义,您应该研究赋值=和绑定之间的区别:=.检查变量via也可能是有益的.VAR.WHAT.
请注意,只要其元素在绑定时满足类型约束,我们也可以重新绑定到另一个标量容器.
这可以用来破坏类型系统:
my Int $a;
my $b = 42;
$a := $b;
$b = "not cool";
say $a;
Run Code Online (Sandbox Code Playgroud)
不酷:(