【发布时间】:2018-09-09 20:01:51
【问题描述】:
我知道这已经被问过了for Perl。
Raku 是否对数组和列表做出同样的区分?
【问题讨论】:
标签: raku
我知道这已经被问过了for Perl。
Raku 是否对数组和列表做出同样的区分?
【问题讨论】:
标签: raku
TL;DR 它有区别,但不完全相同。其实细节上差别很大。
有一个“列表”(带有小写的“l”)的一般非正式概念,它是一个事物的概念,然后是另一个事物,然后是另一个事物。
这个一般概念有多种变体:参数列表(捕获)、参数列表(签名)、值列表等。
在这个非正式的层面上,“list”和“array”这两个词在很大程度上可以互换,尽管“list”倾向于强调不变性,“array”的可变性。
Positional、Iterable、List、Array、Seq等更正式地说,listy 事物通常是 "do" listy roles 的类型。两个主要的列表角色是Positional 和Iterable。
does 是 Positional 和 Iterable 角色的 List(大写“L”)类型。还有一个Array 类型,它是List 的子类。还有一些本机数组也具有Positional 和Iterable 角色,但它们是arrays,不是Arrays 也不是Lists:
my int @array;
say @array ~~ Array; # False
say @array ~~ array; # True
Lists 和数组(Arrays 或 arrays)之间的行为差异与可变性有关。 List 可以很容易地构造,从而保证它是不可变的。相反,数组永远不能本质上保证不可变(当然可以编写代码以在构造后不改变它)。更具体地说:
添加或减去元素。 List 的长度在构造后无法更改。诸如.push 之类的方法将在List 上失败。相反,如果数组在构造时声明为具有固定长度,则数组只有固定长度。
分配和/或绑定到元素。 List 的元素只有在构造时绑定到 lvalues 时才能分配。它们永远无法重新绑定。相比之下,Array 的元素在构造时总是绑定到 Scalar(左值),因此是可赋值的,并且总是可重新绑定的,这意味着它们是否可以赋值(使用 = 赋值运算符)取决于他们是否绑定到Scalar。
还有其他几个重要的列表类型,例如:
doc.raku.org 的“官方”文档有一个 Lists, Sequences, and Arrays 页面,应该会有所帮助。
【讨论】:
my @a = ^10; @a[3] := 42; @a[3] = 666; # Cannot assign to an immutable value
my @a = ^10; @a[3] := 42; @a[3] := $; @a[3] = 666; say @a[3]; # 666。我目前认为我们同意的一点是,Array 的 slots 是总是可变的,即使相应的内容暂时不是 assignable i>,而List 的每个插槽在List 构造 时单独设置为永久不可变或永久可变。
让我在 Perl 中添加一个列表,一个短暂的东西;在 Raku 中,它是 regular type,并且以逗号分隔的文字列表产生一个:
$ raku -e 'say (1, 2, 3).^name'
List
数组还支持列表所没有的push、pop、shift、unshift 和splice 方法。
【讨论】: