数组与列表数据类型?

Array vs. list data type?

我知道有人问过这个问题 for Perl
Raku 对数组和列表的区分是否相同?

TL;DR 有区别,但不完全一样。其实细节上还是很不一样的

非正式的“列表”和“数组”概念

“列表”(小写'l')的一般非正式概念是一件事的概念,然后是另一件事,然后是另一件事。

这个一般概念有变体:参数列表(捕获)、参数列表(签名)、值列表等。

在这个非正式层面上,“列表”和“数组”这两个词在很大程度上是可以互换的,尽管“列表”倾向于强调不变性,而“数组”则强调可变性。

正式类型:PositionalIterableListArraySeq

更正式地说,列表项通常是 "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 arrays,没有 Arrays 也没有 Lists:

my int @array;
say @array ~~ Array; # False
say @array ~~ array; # True

Lists 和数组(Arrays 或 arrays)之间的行为差​​异与可变性有关。 List 可以很容易地构造,以保证它是不可变的。相比之下,数组永远不能本质上保证不可变(当然可以编写代码以在构造后不改变它)。更具体地说:

  • 添加或减去元素。 List 的长度在构造后不能更改。 .push 等方法将在 List 上失败。相反,只有在构造时声明为具有固定长度的数组才具有固定长度。

  • 正在将 and/or 绑定分配给元素。 List 元素永远不可重新绑定,并且只有在绑定到lvalue 施工时。相比之下,Array 元素始终是可重新绑定的(我忽略了 NYI ::=),并且只有在绑定到不可变值时才能不可 分配。

还有其他几种重要的列表类型,例如:

  • A Seq 是“一个可迭代的惰性值序列”。

  • A Capture 用于各种目的,最显着的是用于包含参数列表和作为 regex/grammar Match class 的父类型.

doc.raku.org has a Lists, Sequences, and Arrays 页面上的“官方”文档应该会有帮助。

让我补充一点,在 Perl 中,列表是一种短暂的东西;在 Raku 中它是一个 regular type,一个 comma-separated 文字列表产生一个:

$ raku -e 'say (1, 2, 3).^name'
List

数组还支持列表所没有的pushpopshiftunshiftsplice方法。