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

PUBLISHED ON FEB 25, 2018 — PROGRAMMING

    陣列

    陣列 (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 型別僅用在程序的參數中,用來宣告參數的型別,相容於陣列和序列。

    comments powered by Disqus