Nim教程【十二】

liulun發表於2015-06-18

排除指定符號

一般情況下使用import語句,會把一個模組內的符號都匯入進來

如果你像排除特定的符號(不想讓某些符號被匯入進來)

可以使用except子句

就像下面這樣

import mymodule except y

這行程式碼排除了mymodule模組中的y符號,其他符號都匯入了

如果想排除更多的符號,可以使用逗號分割

 

匯入指定符號

我們還可以使用from語句來匯入指定的符號

請看下面的程式碼:

from mymodule import x, y, z

上面的程式碼中,只匯入了mymodule模組的x,y,z三個符號

 

強行名稱空間限定

先來看看下面的程式碼

from mymodule import x, y, z

x()           # use x without any qualification

在上面的程式碼中,

當前模組使用x的時候沒有任何限制,直接使用就可以,

就好像在當前模組定義的一樣

但有些時候,開發人員是希望他帶著名稱空間一起使用的

from關鍵詞與nil關鍵詞結合可以實現這種限制

來看看下面的程式碼

from mymodule import nil

mymodule.x()  # must qualify x with the module name as prefix

x()           # using x here without qualification is a compile error

有些時候模組名稱挺長的

而又要使用名稱空間限定的時候

就會帶來很大的麻煩

這時,可以給模組名稱起一個別名

請看下面的程式碼:

from mymodule as m import nil

m.x()         # m is aliasing mymodule

按這樣的程式碼,就可以使用簡短的模組別名作為名稱空間了

 

include語句

include語句與from語句有著本質的區別

include語句在編譯期把幾個檔案合併成一個檔案

這有利於把一個大的檔案分割成幾個檔案

include fileA, fileB, fileC

 

物件

在Nim中,物件和元組很像

物件也是把一系列不同的東西放到一起的一種方式

當物件還提供了很多元組沒有的功能

物件提供了繼承和資訊隱藏

由於物件的封裝特性,所以物件的構造方法只能用於物件的內部

(物件應該提供一個方法用於初始化物件,這就是構造器)

如果你想在執行期訪問一個物件例項的型別

可以使用of操作符,比如下面的程式碼:

type
  Person = ref object of RootObj
    name*: string  # the * means that `name` is accessible from other modules
    age: int       # no * means that the field is hidden from other modules
  
  Student = ref object of Person # Student inherits from Person
    id: int                      # with an id field

var
  student: Student
  person: Person
assert(student of Student) # is true
# object construction:
student = Student(name: "Anton", age: 5, id: 2)
echo student[]

標記為*的屬性可以被外部訪問到

一個物件的型別只能通過type定義

Nim中的物件支援繼承,但並不支援多繼承,說不定以後會支援多繼承

如果一個物件沒有合適的祖先

那麼可以使用RootObj作為作為他的祖先

一個物件型別可以沒有祖先,

但如果沒有祖先的話,那麼他同樣也不能有子孫

可以使用inheritable來產生一個非RootObj的子孫物件

(Nim的GTK包就是這麼幹的)

使用ref關鍵字來明確繼承關係

注意:在設計上組合往往優於繼承

 

自引用物件型別

物件、元組都可以塑造出相當複雜的型別(資料結構)

比如說自引用型別

請看如下程式碼:

type
  Node = ref NodeObj # a traced reference to a NodeObj
  NodeObj = object
    le, ri: Node     # left and right subtrees
    sym: ref Sym     # leaves contain a reference to a Sym
  
  Sym = object       # a symbol
    name: string     # the symbol's name
    line: int        # the line the symbol was declared in
    code: PNode      # the symbol's abstract syntax tree

 

 

好了,今天就寫到這裡,喜歡的朋友請幫忙點個推薦

相關文章