数组与列表数据类型?
Array vs. list data type?
我知道有人问过这个问题 for Perl。
Raku 对数组和列表的区分是否相同?
TL;DR 有区别,但不完全一样。其实细节上还是很不一样的
非正式的“列表”和“数组”概念
“列表”(小写'l')的一般非正式概念是一件事的概念,然后是另一件事,然后是另一件事。
这个一般概念有变体:参数列表(捕获)、参数列表(签名)、值列表等。
在这个非正式层面上,“列表”和“数组”这两个词在很大程度上是可以互换的,尽管“列表”倾向于强调不变性,而“数组”则强调可变性。
正式类型:Positional
、Iterable
、List
、Array
、Seq
等
更正式地说,列表项通常是 "do" listy roles. The two main listy roles are the Positional
and Iterable
.
有一个 List
(capital 'L') type which does
the Positional
and Iterable
roles. There is also an Array
type which is a sub-class of List
. And there are native arrays which also do the Positional
and Iterable
roles but are array
s,没有 Array
s 也没有 List
s:
my int @array;
say @array ~~ Array; # False
say @array ~~ array; # True
List
s 和数组(Array
s 或 array
s)之间的行为差异与可变性有关。 List
可以很容易地构造,以保证它是不可变的。相比之下,数组永远不能本质上保证不可变(当然可以编写代码以在构造后不改变它)。更具体地说:
添加或减去元素。 List
的长度在构造后不能更改。 .push
等方法将在 List
上失败。相反,只有在构造时声明为具有固定长度的数组才具有固定长度。
正在将 and/or 绑定分配给元素。 List
元素永远不可重新绑定,并且只有在绑定到lvalue 施工时。相比之下,Array
元素始终是可重新绑定的(我忽略了 NYI ::=
),并且只有在绑定到不可变值时才能不可 分配。
还有其他几种重要的列表类型,例如:
doc.raku.org has a Lists, Sequences, and Arrays 页面上的“官方”文档应该会有帮助。
让我补充一点,在 Perl 中,列表是一种短暂的东西;在 Raku 中它是一个 regular type,一个 comma-separated 文字列表产生一个:
$ raku -e 'say (1, 2, 3).^name'
List
数组还支持列表所没有的push
、pop
、shift
、unshift
和splice
方法。
我知道有人问过这个问题 for Perl。
Raku 对数组和列表的区分是否相同?
TL;DR 有区别,但不完全一样。其实细节上还是很不一样的
非正式的“列表”和“数组”概念
“列表”(小写'l')的一般非正式概念是一件事的概念,然后是另一件事,然后是另一件事。
这个一般概念有变体:参数列表(捕获)、参数列表(签名)、值列表等。
在这个非正式层面上,“列表”和“数组”这两个词在很大程度上是可以互换的,尽管“列表”倾向于强调不变性,而“数组”则强调可变性。
正式类型:Positional
、Iterable
、List
、Array
、Seq
等
更正式地说,列表项通常是 "do" listy roles. The two main listy roles are the Positional
and Iterable
.
有一个 List
(capital 'L') type which does
the Positional
and Iterable
roles. There is also an Array
type which is a sub-class of List
. And there are native arrays which also do the Positional
and Iterable
roles but are array
s,没有 Array
s 也没有 List
s:
my int @array;
say @array ~~ Array; # False
say @array ~~ array; # True
List
s 和数组(Array
s 或 array
s)之间的行为差异与可变性有关。 List
可以很容易地构造,以保证它是不可变的。相比之下,数组永远不能本质上保证不可变(当然可以编写代码以在构造后不改变它)。更具体地说:
添加或减去元素。
List
的长度在构造后不能更改。.push
等方法将在List
上失败。相反,只有在构造时声明为具有固定长度的数组才具有固定长度。正在将 and/or 绑定分配给元素。
List
元素永远不可重新绑定,并且只有在绑定到lvalue 施工时。相比之下,Array
元素始终是可重新绑定的(我忽略了 NYI::=
),并且只有在绑定到不可变值时才能不可 分配。
还有其他几种重要的列表类型,例如:
doc.raku.org has a Lists, Sequences, and Arrays 页面上的“官方”文档应该会有帮助。
让我补充一点,在 Perl 中,列表是一种短暂的东西;在 Raku 中它是一个 regular type,一个 comma-separated 文字列表产生一个:
$ raku -e 'say (1, 2, 3).^name'
List
数组还支持列表所没有的push
、pop
、shift
、unshift
和splice
方法。