考虑以下 Python 代码(作为示例):
a = 5
b = "a"
l = [a, b] # -> typing.List[typing.Any]
print(l)
# [5, "a"]
列表类型
l
是 list
;它不受它所拥有的类型的限制,因为 Python 是非常动态类型的。将其与强结构类型的 Go 进行对比:
var list []uint8{1, 2, 3, 4, 5, 6}
该列表只能保存最多 255 个无符号整数。它不能保存任何其他类型。
也去:
var multi interface{"string", []int{9, 5}, rune('5'), []interface{}}
接口(interface)允许变体类型的容器。
考虑 Perl 6,它比 Python 的动态类型更加
say 6 + "1";
。会给7
, 整数。 (谁认为这是一个好主意,我不知道。)我喜欢在我的程序中逐渐键入(尤其是对于我正在学习的 Perl 6)它提高了可读性和可维护性。
以下都不起作用:
use strict;
my Int $n = 6;
my Str $x = "a";
my Int @l = $n, $x;
也不
use strict;
my Int $n = 6;
my Str $x = "a";
my List @l = $n, $x;
你得到
Type check failed in assignment to @l; expected List but got Int
. (其他列表构造语法( [vals]
, <vals>
)给出相同的错误)。什么工作是说类型是
Any
(或 Mu
)这是有道理的。 (嗯,这对我来说很有意义,因为 Any
与 Python 3.5 使用的关键字相同。)use strict;
my Int $n = 6;
my Str $x = "a";
my Any @l = $n, $x;
但是使用
Any
或 Mu
首先有点违背了类型检查的目的。列表的类型是什么,如果不是
List
?而且,为什么是my List $blah;
如果类型检查永远不会通过任何值或其列表,则语法是否有效?
最佳答案
你解释错了,至少 Python 中的列表与 Perl6 中的列表不同,它实际上就像 Perl6 中的数组(而 Perl6 列表就像 Python 元组)。
当你这样做时:
my List @l = $n, $n;
you create an array
@l
和 enforce all its elements must be 类型 List
.所以你的第二个例子:
use strict;
my Int $n = 6;
my Int @l = $n, $n;
必须工作。
编码:
my Any @l = $n, $x;
是相同的:
my @l = $n, $x;
您已允许数组
@l
的元素成为任何类型。
关于list - Perl 6 中任何类型的列表是什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997353/