這是國內第一個關於Nim的系列教程
先說廢話
很開心,在今天凌晨快一點多的時候拿到了
nim-lang.com;nim-lang.cn;nim-lang.net
這三個域名,到不是為了投資,准備用nim-lang.com做一個社區出來
不知道國內有沒有人或者機構打算贊助這個事情的
整型
Nim語言中有10個整型類型
int;int8;int16;int32;int64;uint;uint8;uint16;uint32;uint64
默認的整型類型是int
可以使用尾綴的方式來設置整型的類型,就像下面的代碼這樣:
let x = 0 # x 的類型是int y = 0'i8 # y 的類型是int8 z = 0'i64 # z 的類型是int4 u = 0'u # u 的類型是intuint
由於整形類型經常被用於計算內存里的對象
所以整形的大小和指針的大小一樣
常見的操作符
+ - * div mod < <= == != > >=
都可以用在整形身上
還有一些按位計算的操作符:
and or xor not
也可以用在整型身上
shl操作符可以完成左移位操作
shr操作符可以完成右移位操作
移位操作一般都會把目標當作無符號的整形來對待
因為移位操作往往會導致乘法或除法操作
針對無符號的操作數,操作符做做過二次封裝,不會產生內存泄漏或溢出的問題
在表達式中使用不同類型的整型時,會導致類型轉化
寬度比較小的類型會被轉化成寬度比較大的類型
整形不會自動轉化成浮點類型
同樣,浮點類型也不會自動轉化成整形
toInt方法和toFloat方法可以用來處理這兩種類型轉化操作
浮點類型
有三種浮點類型
float float32 float64
默認的浮點類型是float,在現在的Nim實現中,float類型總是64位的
也可以用尾綴的方式來設置浮點類型的寬度,看下面的代碼:
var x = 0.0 # x 的類型是float y = 0.0'f32 # y 的類型是float32 z = 0.0'f64 # z 的類型是float64
+ - * / < <= == != > >=
以上這些操作符也可以用於浮點類型(遵從IEEE標准)
和整型類型一樣,不同寬度的浮點類型出現在一個表達式中的時候
寬度較小的浮點類型將被格式化成寬度較大的浮點類型
整形不會自動轉化成浮點類型
同樣,浮點類型也不會自動轉化成整形
toInt方法和toFloat方法可以用來處理這兩種類型轉化操作
類型轉化
基本數據類型的關鍵字本身就是一個方法,可以用這些方法完成格式轉化工作
就像下面的代碼一樣:
var x: int32 = 1.int32 # same as calling int32(1) y: int8 = int8('a') # 'a' == 97'i8 z: float = 2.5 # int(2.5) rounds down to 2 sum: int = int(x) + int(y) + int(z) # sum == 100
$操作符和repr方法
nim中的內置類型都可以用$操作符把數據格式化成字符串
但是對於一些高級類型,或者用戶自定義的類型
$就無能為力了(除非你為這些類型重新定義了$操作符)
有些時候你只是想在調試的時候看看一個復雜類型的值
如果每次都要為這個復雜類型定義一個$操作符,那就太麻煩了
這個時候你可以使用repr方法
repr方法可以應用於任何類型,甚至自關聯類型也沒有問題
來看看下面的代碼
var myBool = true myCharacter = 'n' myString = "nim" myInteger = 42 myFloat = 3.14 echo($myBool, ":", repr(myBool)) # --> true:true echo($myCharacter, ":", repr(myCharacter)) # --> n:'n' echo($myString, ":", repr(myString)) # --> nim:0x10fa8c050"nim" echo($myInteger, ":", repr(myInteger)) # --> 42:42 echo($myFloat, ":", repr(myFloat)) # --> 3.1400000000000001e+00:3.1400000000000001e+00
注意在repr(mystring)的時候,他的內存地址也被輸出出來了
關鍵字type
在Nim中,使用type關鍵字來定義一個類型,來看下面的代碼:
type biggestInt = int64 # biggest integer type that is available biggestFloat = float64 # biggest float type that is available
對象類型和枚舉類型也是通過type關鍵字定義的
枚舉類型
一個枚舉類型定義了一個有序的值序列
值序列中的每個值都是整型的
第一個值為0,第二個值是1,依次類推
一個枚舉類型的變量只能被賦值為這個序列值中的一個
來看段代碼:
type Direction = enum north, east, south, west var x = south # `x` is of type `Direction`; its value is `south` echo($x) # writes "south" to `stdout`
上面代碼中定義的變量x的類型是Direction
注意:最后一行代碼輸出的內容是south,而不是2,
如果使用ord方法的話,可以得到枚舉變量的值
所有的與比較相關的操作符都可以用在枚舉變量身上
可以使用點操作符來避免歧義,就像下面的代碼一樣:
var x = Direction.south
為了更好的兼容其他語言,枚舉類型內定義的符號可以指定為特定的值
但是在你指定特定值的時候,一定要按大小順序指定
如果你沒有明確給定一個符號的值,那么這個符號的值就是他上一個符號的值再加1
來看一下下面的示例代碼:
type MyEnum = enum a = 2, b = 4, c = 89
好,今天就寫到這里,喜歡的人請點推薦!