我本来会把它编辑成我的其他相关问题,但感觉不一样,我不想在每个问题上问太多问题.
我的思绪......爆炸了.
考虑:
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
将是List
s 的元素.你不需要声明@l
它将是一个数组; 当你使用这个印记时,你已经这样做了.
您可以通过替换来移动爆炸List
,Int
以使Perl 6期望Int
s 列表.
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)
不酷:(
归档时间: |
|
查看次数: |
263 次 |
最近记录: |