Nim教程【六】


目前看來這是國內第一個關於Nim的系列教程

先說廢話

        Rust1.0已經發布了,

        國內有一個人為這個事情寫了一篇非常長的博客

        這篇文章我前幾天草草的看了一下,只記得這位朋友追Rust的艱辛,其他內容都已經記不清楚了

        我覺得,任何正向付出都是值得鼓勵和尊敬的

        這節不對其他語言做任何吐槽

        就吐槽Nim本身,

        Nim這個語言之前叫做Nimrod,意思是獵人,

        是一個聖經里的人物,曾經做過國王,大概是英勇善戰、威風八面的人物吧

        關鍵是Nimrod這個單詞的讀音:['nɪmrɒd]

        真是叫人擔心啊,居然讀作“尼瑪的”!哈哈

        (不過據說國內go語言圈里有一個人物在開發yin語言,我想名字的讀音上也沒有什么高下之分吧)

迭代器

        先來看看我們上幾篇博客提到的有關循環的代碼

echo("Counting to ten: ")
for i in countup(1, 10):
  echo($i)

       countup就是一個迭代器,他是怎么實現的呢?

        先來看一個錯誤的例子

proc countup(a, b: int): int =
  var res = a
  while res <= b:
    return res
    inc(res)

        這是不對的,因為對於一個方法來說,return之后就退出了這個方法,return有沒有在循環體內部

        那么我們看看正確的寫法是怎樣的

iterator countup(a, b: int): int =
  var res = a
  while res <= b:
    yield res
    inc(res)
    • 這並不是用proc聲明的方法,而是用iterator聲明的迭代器

    • 迭代器內部可以用yield關鍵字“迭代”返回某一個變量的值(很像C#)

    • 迭代器只能用在for循環中

    • 迭代器中不能包含return關鍵字

    • 方法中也不能包含yield關鍵字

    • 迭代器中並沒有一個隱藏的result變量

    • 迭代器不支持遞歸

    • 迭代器不支持前置聲明(這項要求將在未來的編譯器中被刪掉)

        關於迭代器還有很多內容,我們將在后面的章節再聊

bool類型

        bool類型有兩個值:true和false

        用在while,if ,elif,when這些流程控制語句中,用於判斷是否滿足條件

        諸如:not,and,or,xor,<,<=,>,>=,!=,==這類操作符,計算的結果就是bool類型的值

        來看個例子:

while p != nil and p.name != "xyz":
  # p.name is not evaluated if p == nil
  p = p.next

字符類型

        關鍵字是char,這種類型占據一個字節,因此它不能表示一個UTF-8的字符,

        但是它可以用於表示一個UTF-8字符的一部分,這么搞主要是為了提升性能。

        for the overwhelming majority of use-cases, 

        the resulting programs will still handle UTF-8 

        properly as UTF-8 was specially designed for this(這一句不敢亂翻譯)

        用單引號包住一個字符,就可以為字符類型的變量設置值了

        諸如==,<,>,<=,>=這些操作符,可以用來操字符類型

        $操作符可以把一個字符類型格式化成字符串類型

        字符類型不能和數字類型混淆,要想得到一個字符類型的“序數值”,請使用ord方法

        把一個數字類型的值格式化成字符類型,請使用chr方法

字符串類型

        字符串類型是一個mutable類型(可變類型),

        因此,對於一個字符串的拼接操作來說,性能表現非常好;

        Nim中的字符串類型是以\0結尾的(與C語言相似)

        但Nim中的字符串類型還包含一個長度的屬性(這樣你取一個字符串的屬性,就非常高效了)

        這個屬性不會計算字符串結尾的\0字符

        你可以通過len方法獲得一個字符串的長度,

        另外,還有一個值得注意的地方:

if s[i] == 'a' and s[i+1] == 'b':

        像這樣的代碼,是不用檢測i+1是不是已經到了字符串的結尾的

        也就是說,方位字符串的最后一個索引(\0位置的索引),不會有問題

        

        賦值運算符會導致一個字符串被復制

        你可以使用&運算符來鏈接兩個字符串

        (你也可以使用add運算符,來把一個字符串添加到另一個字符串的結尾)

 

        字符串的比較是按字符串內的字符順序做比較的

        所有的比較操作符都可以用在字符串身上

        按照慣例,所有的字符串都是UTF-8類型的字符串,但這並不是強制執行的

        當你從一個二進制文件中讀取數據的時候,他僅僅是一系列的字節

        s[i]是指在i位置的字符char,而不是在i位置的unichar

 

        string類型的變量默認值是nil,很多針對string類型的操作,都不能用在nil身上(這樣干會觸發一個異常)

        如果你不希望這樣,那么你最好用""來初始化你的字符串變量(但這會導致在堆上創建一個“”字符串變量)

        所以你自己做權衡吧!

 

 

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


免責聲明!

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



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