考虑以下Python代码(作为示例):
a = 5
b = "a"
l = [a, b] # -> typing.List[typing.Any]
print(l)
# [5, "a"]
Run Code Online (Sandbox Code Playgroud)
列表的类型l是list; 它不受它所拥有的类型的约束,因为Python是非常动态的类型.
将此与Go相比较,Go是强结构类型的:
var list []uint8{1, 2, 3, 4, 5, 6}
Run Code Online (Sandbox Code Playgroud)
该列表只能保存最多255个无符号整数.它不能保存任何其他类型.
也去:
var multi interface{"string", []int{9, 5}, rune('5'), []interface{}}
Run Code Online (Sandbox Code Playgroud)
接口允许不同类型的容器.
考虑Perl 6的,这更加动态地在类型比Python say 6 + "1";会给7的整数.(谁认为这是一个我不知道的好主意.)
我喜欢逐渐输入我的程序(特别是对于我正在学习的Perl 6),它提高了可读性和可维护性.
以下工作都不是:
use strict;
my Int $n = 6;
my Str $x = "a";
my Int @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)
也不
use strict;
my Int $n = 6;
my Str $x = "a";
my List @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)
你得到Type check failed in assignment to @l; expected List but got Int.(其他列表构造语法([vals],<vals>)给出相同的错误).
什么做的工作是说的类型Any(或Mu),这是有道理的.(嗯,这对我来说很有意义,因为AnyPython 3.5使用的是相同的关键字.)
use strict;
my Int $n = 6;
my Str $x = "a";
my Any @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)
但是首先使用Any或者Mu有点击败类型检查的目的.
列表的类型是什么,如果不是List?此外,为什么my List $blah;有效的语法,如果类型检查永远不会传递任何值或其列表?
你理解错了,至少列表中Python是从不同的列表中Perl6,它实际上就像在Perl6阵列(和Perl6 名单是像Python 元组).
当你这样做时:
my List @l = $n, $n;
Run Code Online (Sandbox Code Playgroud)
所以你的第二个例子:
use strict;
my Int $n = 6;
my Int @l = $n, $n;
Run Code Online (Sandbox Code Playgroud)
必须工作.
代码:
my Any @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)
是相同的:
my @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)
您已允许数组元素为@l任何类型.
如果要对列表的元素进行类型检查,则可以使用绑定:=而不是赋值=:
my Int $n = 6;
my Str $x = "a";
# Bind $n and $x to elements of @bound
my @bound := $n, $x;
@bound[1].say; # Prints "a"
@bound[1] = "Hello"; # Changing the second element changes $x
$x.say; # Prints "Hello"
@bound[1] = 6; # Dies with error "Type check failed in assignment to $x; expected Str but got Int"
Run Code Online (Sandbox Code Playgroud)
请注意,最后一行创建的错误是指$x,而不是@bound[1]。