考虑到 Perl 6 的类型系统,这个 Perl 有何意义?
How is this Perl sensical, considering Perl 6's type system?
我本来打算把它编辑成 ,但感觉很不一样,我不想每个问题问太多问题。
我的思想...已经爆炸了。
考虑:
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
所以...List 的类型是 List 但我不能说它是 List 因为那是一种罪过!
这是怎么回事?这是一个错误吗?还是我把无关紧要的 Python 和 Go 习语带到了 Perl 并破坏了东西?
my List @l = $n, $x;
并不像您认为的那样。它没有声明 @l
是 List
。它声明 @l
的元素将是 List
s。您不需要声明 @l
将是一个数组;你在使用印记时已经这样做了。
您可以通过将 List
替换为 Int
来移动爆炸,使 Perl 6 期待 Int
的列表。
my List @l;
是shorthand表示
my @l is Array of List;
对数组的 元素 设置了 List
类型约束。
容器的类型约束已经通过 @
sigil 表达,对应于角色 Positional
,而 %
sigil 对应于角色 Associative
.
$
变量的情况类似,因为还涉及一个容器(Scalar
),其单个元素具有约束。但是,该约束还允许直接重新绑定到去容器化的值1.
1 如果上面的内容对你来说没有意义,你应该看看赋值 =
和绑定 :=
之间的区别。通过 .VAR.WHAT
.
检查变量也可能具有指导意义
请注意,我们也可以重新绑定到另一个标量容器,只要它的元素满足绑定时的类型约束。
这可以用来颠覆类型系统:
my Int $a;
my $b = 42;
$a := $b;
$b = "not cool";
say $a;
不酷:(
我本来打算把它编辑成
我的思想...已经爆炸了。
考虑:
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
所以...List 的类型是 List 但我不能说它是 List 因为那是一种罪过!
这是怎么回事?这是一个错误吗?还是我把无关紧要的 Python 和 Go 习语带到了 Perl 并破坏了东西?
my List @l = $n, $x;
并不像您认为的那样。它没有声明 @l
是 List
。它声明 @l
的元素将是 List
s。您不需要声明 @l
将是一个数组;你在使用印记时已经这样做了。
您可以通过将 List
替换为 Int
来移动爆炸,使 Perl 6 期待 Int
的列表。
my List @l;
是shorthand表示
my @l is Array of List;
对数组的 元素 设置了 List
类型约束。
容器的类型约束已经通过 @
sigil 表达,对应于角色 Positional
,而 %
sigil 对应于角色 Associative
.
$
变量的情况类似,因为还涉及一个容器(Scalar
),其单个元素具有约束。但是,该约束还允许直接重新绑定到去容器化的值1.
1 如果上面的内容对你来说没有意义,你应该看看赋值 =
和绑定 :=
之间的区别。通过 .VAR.WHAT
.
请注意,我们也可以重新绑定到另一个标量容器,只要它的元素满足绑定时的类型约束。
这可以用来颠覆类型系统:
my Int $a;
my $b = 42;
$a := $b;
$b = "not cool";
say $a;
不酷:(