Nim教程【七】


這是國內第一個關於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

 

好,今天就寫到這里,喜歡的人請點推薦!

 


免責聲明!

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



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