Nim教程【九】


向關注這個系列的朋友們,道一聲:久違了!

它並沒有被我閹掉,他一定會得善終的,請各位不要灰心


Set集合類型

為了在特殊場景下提高程序的性能設置了Set類型,同時也是為了保證性能,所以Set只能容納有序類型,

Set類型可以被一個大括號實例化:

var x = {},x就是一個空的set類型

還可以在大括號構造符號內部填寫set變量內部的元素,或一組元素

就像下面的代碼一樣

type
  CharSet = set[char]
var
  x: CharSet
x = {'a'..'z', '0'..'9'}

可以用於Set類型的操作符

操作符 含義
A + B union操作,鏈接兩個Set變量
A * B 得到兩個集合的交集
A - B 得到兩個集合的差異(A中哪些元素是B所不包含的)
A == B
判斷兩個集合是否相等
A <= B A是否與B相等或者A是否是B的子集
A < B A是否是B的子集
e in A A包含元素e
e notin A A不包含元素e
contains(A,e) A包含元素e
Card(A)
A中包含多少個元素
incl(A,e)
與A = A +  {e}相同
excl(A,e) 與A = A - {e}相同

Array數組類型

數組是一個固定長度的容器

數組中的每個元素必須類型相同

數組可以使用方括號構造

請看下面的代碼

type
  IntArray = array[0..5, int] # an array that is indexed with 0..5
var
  x: IntArray
x = [1, 2, 3, 4, 5, 6]
for i in low(x)..high(x):
  echo(x[i])

代碼中x[i]的意思是訪問數組x的第i個元素

nim語言會對數組訪問執行邊界檢查

你通過開關的形式來設置:到底是在編譯期執行邊界檢查,還是在運行期執行邊界檢查

(譯注:我們這里就不講怎么設置這個開關了)

數組是值類型的,像其他值類型一樣,賦值操作將復制整個數組內容

len方法返回數組的長度

low方法返回數組的最小下標

high方法返回數組的最大下標

請仔細看一下下面的代碼:

type
  Direction = enum
    north, east, south, west
  BlinkLights = enum
    off, on, slowBlink, mediumBlink, fastBlink
  LevelSetting = array[north..west, BlinkLights]
var
  level: LevelSetting
level[north] = on
level[south] = slowBlink
level[east] = fastBlink
echo repr(level)  # --> [on, fastBlink, slowBlink, off]
echo low(level)   # --> north
echo len(level)   # --> 4
echo high(level)  # --> west

可以用多個方括號來實現多維數組

在多維數組中,不同的緯度可以擁有不同的索引類型

來看一下下面的代碼

type
  Direction = enum
    north, east, south, west
  BlinkLights = enum
    off, on, slowBlink, mediumBlink, fastBlink
  LevelSetting = array[north..west, BlinkLights]
  LightTower = array[1..10, LevelSetting]
var
  tower: LightTower
tower[1][north] = slowBlink
tower[1][east] = mediumBlink
echo len(tower)     # --> 10
echo len(tower[1])  # --> 4
echo repr(tower)    # --> [[slowBlink, mediumBlink, ...more output..
# The following lines don't compile due to type mismatch errors
#tower[north][east] = on
#tower[0][1] = on

注意:len(tower)只返回第一維數組的長度

我們還可以通過下面的方式定義多維數組,(可讀性更好一些)

type
  LightTower = array[1..10, array[north..west, BlinkLights]]

還有一種簡單的定義數組的方法,來看看下面的代碼

type
  IntArray = array[0..5, int] # an array that is indexed with 0..5
  QuickArray = array[6, int]  # an array that is indexed with 0..5
var
  x: IntArray
  y: QuickArray
x = [1, 2, 3, 4, 5, 6]
y = x
for i in low(x)..high(x):
  echo(x[i], y[i])

從上面的代碼中可以看出,定義數組的時候,不必每次都要指定數組的最小下標

seq序列類型

seq類型類似於數組,但seq類型可以在運行期改變容器的長度;

也正是因為seq是長度可變的,所以nim在內存堆上為它分配空間和進行垃圾收集

seq類型的索引總是從0開始的,

len、low、high操作同樣適用於seq類型

可以通過x[i]訪問seq類型的x變量的第i個元素

seq類型可以通過@和方括號來構造,也可以使用內置的newSeq方法來構造

請看下面的代碼

var
  x: seq[int] # a sequence of integers
x = @[1, 2, 3, 4, 5, 6] # the @ turns the array into a sequence

如果你沒有為一個seq類型的變量賦值,那么它的默認值將為nil

在很多應用在seq變量的操作中,操作nil的話會拋出異常

所以很多人都會為seq類型的變量設置空值:@[]

但是設置空值的話,會在內存堆上創建一個空序列

一定程度上有損性能

請你自行斟酌權衡吧

用for語句遍歷一個序列的時候,for語句中可以存在一個或兩個變量

如果是一個變量的時候,

這個變量將持有每次迭代過程中seq提供的值

如果是兩個變量的時候,

第一個變量將保存索引的位置

第二個變量將保存seq提供的值

請看下面的代碼:

for i in @[3, 4, 5]:
  echo($i)
# --> 3
# --> 4
# --> 5

for i, value in @[3, 4, 5]:
  echo("index: ", $i, ", value:", $value)
# --> index: 0, value:3
# --> index: 1, value:4
# --> index: 2, value:5



今天就寫到這里吧!

喜歡的人請幫忙點個推薦!




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM