文档 / 语言手册 / 数组 & 列表
Edit

数组和列表

数组

数组是最主要的有序数据结构。它的用法和 JavaScript 数组相同:可随机访问,动态调整大小,以及更新等。

ReScriptJS Output
let myArray = ["hello", "world", "how are you"]

ReScript 数组的元素类型必须相同,即满足同质性(homogeneous)。

用法

查看 Js.Array 模块的 API 文档。

访问和更新数组项的方法如下:

ReScriptJS Output
let myArray = ["hello", "world", "how are you"]

let firstItem = myArray[0] // "hello"

myArray[0] = "hey" // now ["hey", "world", "how are you"]

let pushedValue = Js.Array2.push(myArray, "bye")

列表

ReScript 也提供了单链表,它具有以下特性:

  • 不可变

  • 头插速度快

  • 获取头部元素快

  • 其他操作很慢

ReScriptJS Output
let myList = list{1, 2, 3}

和数组一样,列表的元素类型必须相同。

用法

你可以使用列表来利用它可变长度,快速头插,和快速拆分的特性,所有操作都是不可变且无副作用的,而且相对高效。

如果你要进行随机访问或非头插操作,那么请勿使用列表。你的代码最后会变得又丑又慢。

标准库提供了一个 List 模块

无副作用头插

使用展开(spread)语法:

ReScriptJS Output
let myList = list{1, 2, 3}
let anotherList = list{0, ...myList}

myList 不会被修改,anotherList 的值是 list{0, 1, 2, 3} 。这个操作十分高效(常数而非线性时间复杂度),anotherList 的最后 3 个元素是与 myList 共享的!

注意,list{a, ...b, ...c} 的语法是错误的,我们不支持列表的多次展开。这是一个线性操作(O(b)),因为 b 中的每一项都要被逐一添加到 c 的头部。你可以使用 List.concat 完成这个操作,但我们非常不建议这样做。

我们也不鼓励更新列表中间的任意项,因为它的性能和内存分配开销是线性的(O(n))。

访问

switch(详见模式匹配)通常用于访问列表项:

ReScriptJS Output
let message =
  switch myList {
  | list{} => "This list is empty"
  | list{a, ...rest} => "The head of the list is the string " ++ Js.Int.toString(a)
  }