【问题标题】:Array vs. list data type?数组与列表数据类型?
【发布时间】:2018-09-09 20:01:51
【问题描述】:

我知道这已经被问过了for Perl
Raku 是否对数组和列表做出同样的区分?

【问题讨论】:

    标签: raku


    【解决方案1】:

    TL;DR 它有区别,但不完全相同。其实细节上差别很大。

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

    有一个“列表”(带有小写的“l”)的一般非正式概念,它是一个事物的概念,然后是另一个事物,然后是另一个事物。

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

    在这个非正式的层面上,“list”和“array”这两个词在很大程度上可以互换,尽管“list”倾向于强调不变性,“array”的可变性。

    正式类型:PositionalIterableListArraySeq

    更正式地说,listy 事物通常是 "do" listy roles 的类型。两个主要的列表角色是PositionalIterable

    doesPositionalIterable 角色的 List(大写“L”)类型。还有一个Array 类型,它是List 的子类。还有一些本机数组也具有PositionalIterable 角色,但它们是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

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

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

    • Capture 用于各种目的,最明显的是用于包含参数列表和作为正则表达式/语法 Match 类的父类型。

    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。我目前认为我们同意的一点是,Arrayslots总是可变的,即使相应的内容暂时不是 assignable i>,而List 的每个插槽在List 构造 时单独设置为永久不可变或永久可变。
    【解决方案2】:

    让我在 Perl 中添加一个列表,一个短暂的东西;在 Raku 中,它是 regular type,并且以逗号分隔的文字列表产生一个:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2010-09-10
      • 1970-01-01
      • 2020-08-12
      • 2019-08-17
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多