向關注這個系列的朋友們,道一聲:久違了!
它並沒有被我閹掉,他一定會得善終的,請各位不要灰心
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
今天就寫到這里吧!
喜歡的人請幫忙點個推薦!