美思 [Nim] 語言程式教學:陣列 (Array) 和序列 (Sequence)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

陣列

陣列 (array) 是線性的容器,建立後長度不可改變,陣列中每個元素的型別皆需相同。

建立陣列

使用陣列實字可建立陣列,如下例:

var arr = [1, 2, 3, 4, 5]
assert(arr.len == 5)
assert(arr[2] == 3)

或是宣告空陣列後再填入值,如下例:

var arr: array[3, int]

arr[0] = 1
arr[1] = 42
arr[2] = 99

assert arr[0] == 1
assert arr[1] == 42
assert arr[2] == 99
assert arr.len == 3

走訪陣列

使用 for 結構可走訪陣列的元素,如下例:

var arr = [1, 2, 3, 4, 5]

for e in arr:
  echo e

也可以使用計數器來走訪陣列,如下例:

var arr = [1, 2, 3, 4, 5]

for i in countup(arr.low, arr.high):
  echo arr[i]

修改陣列元素

走訪陣列元素時,不可修改元素,否則會引發錯誤,如下例:

var arr = [1, 2, 3, 4, 5]

for e in arr:
  # Error
  e = e * e

如果想在走訪陣列元素時修改陣列,可使用計數器來走訪陣列,如下例:

var arr = [1, 2, 3, 4, 5]

for i in countup(arr.low, arr.high):
  arr[i] = arr[i] * arr[i]

assert(arr == [1, 4, 9, 16, 25])

序列

序列 (sequence) 和陣列相似,也是線性的容器,序列元素皆為同型別。但序列可更動長度,實際上比陣列常用。

建立序列

使用序列實字可建立序列,和陣列的差別在於前面有一個 @ (小老鼠) 符號。

var seq = @[1, 2, 3, 4, 5]
assert(seq.len == 5)
assert(seq[2] == 3)

走訪序列

使用 for 可以走訪序列元素:

var seq = @[1, 2, 3, 4, 5]

for e in seq:
  echo e

同樣地,也可以使用計數器來走訪:

var seq = @[1, 2, 3, 4, 5]

for i in countup(seq.low, seq.high):
  echo seq[i]

修改序列元素

和陣列類似,走訪序列時不能修改序列元素:

var seq = @[1, 2, 3, 4, 5]

for e in seq:
  # Error
  e = e * e

若要在走訪時修改序列元素,可用計數器走訪序列:

var seq = @[1, 2, 3, 4, 5]

for i in countup(seq.low, seq.high):
  seq[i] = seq[i] * seq[i]

assert(seq == @[1, 4, 9, 16, 25])

序列操作

序列和陣列的差別在於序列可動態改變長度,一些常見的序列操作如下:

var seq = @[1, 2, 3, 4, 5]

# Append in-place.
seq.add(99)
assert(seq == @[1, 2, 3, 4, 5, 99])

# `delete` returns nothing.
seq.delete(2)
assert(seq == @[1, 2, 4, 5, 99])

seq.insert(-1, 1)
assert(seq == @[1, -1, 2, 4, 5, 99])

sequtils 套件中,有更多序列操作方法,讀者可自行參考該模組的手冊。

openArray

openArray 型別僅用在程序的參數中,用來宣告參數的型別,相容於陣列和序列。

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。