【发布时间】:2016-01-25 16:24:26
【问题描述】:
考虑以下 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{}}
接口允许使用变体类型的容器。
考虑一下 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; 是有效语法?
【问题讨论】:
-
将中缀数字加法运算符
+用于除数字加法之外的任何内容是一个愚蠢的想法,使用单独的字符串连接运算符更有意义。 -
您使用的是哪个版本的 Rakudo (
perl6 -e 'say $*PERL.compiler')?my Int $n = 6;my Int @l = $n, $n;对我来说很好用(在 2015.12 之前不要打扰任何事情)。此外,几乎没有理由在 Perl 6 程序中使用use strict,因为它是默认设置。 -
@BradGilbert 我粘贴了错误的示例。我是
rakudo (2015.12.219.gd.67.cb.3),但我现在看到了这个问题的答案。 -
你可以通过添加一个候选
multi infix:<+> ( \l, Str \r ){ l~r }; say say 6 + "1"来获得+的 Python 行为 =>61不过不要这样做。 -
@l.WHAT.say打印出(Array)。