前言python
Nim支持把一大段程序分紅若干個模塊編程
一個模塊就是一個源代碼文件編程語言
每一個模塊都擁有它本身的名稱空間模塊化
模塊化能夠起到封裝(信息隱藏)和分步編譯的做用this
一個模塊能夠經過import語句得到另外一個模塊的符號spa
nim語言容許模塊間的循環引用,orm
只有用星號(*)標記的頂級符號纔會被導出給其餘模塊。ci
模塊名和文件名相同,模塊名的命名方式和nim編程語言的標識符命名方式相同開發
編譯器編譯模塊的規則以下:編譯器
按照import的導入順序,編譯模塊
若是存在循環引用,那麼就只導入頂級符號(已解析的符號),若是編譯器發現未知的標識符,那麼就中止編譯
請看下面的例子:
模塊A的代碼:
# Module A type T1* = int # Module A exports the type ``T1`` import B # the compiler starts parsing B proc main() = var i = p(3) # works because B has been parsed completely here main()
模塊B的代碼:
# Module B import A # A is not parsed here! Only the already known symbols # of A are imported. proc p*(x: A.T1): A.T1 = # this works because the compiler has already # added T1 to A's interface symbol table result = x + 1
看起來是否是很厲害呢?!
import語句
能夠經過import導入一個或多個模塊
(導入多個模塊的話,只要在import後面跟上模塊的名字便可,模塊的名字用逗號隔開)
能夠用except排除一個或多個模塊中的符號
請看下面的示例代碼:
import strutils except `%`, toUpper # doesn't work then: echo "$1" % "abc".toUpper
注意:若是導入的模塊中並無導出排除的標識符的話,nim編譯器是不會給出報警或異常的
include語句
include語句徹底不一樣於import語句,
include語句會迫使編譯器把一個文件的源碼「包含」到另外一個文件中。
須要把一個文件拆分紅多個文件的時候include語句頗有用
include fileA, fileB, fileC
import語句中的模塊名
import語句中的模塊名能夠設置別名
import strutils as su, sequtils as qu echo su.format("$1", "lalelu")
若是你用了別名的話,那麼原來的模塊名稱就不起做用了
若是一個模塊在某個子目錄中
可使用以下三種辦法來導入該模塊
import lib.pure.strutils, lib/pure/os, "lib/pure/times"
注意:雖然模塊在子目錄中,可是模塊名並不包含路徑
下面的代碼是錯誤的:
import lib.pure.strutils echo lib.pure.strutils
下面這種代碼設置也沒有任何意義
import lib.pure.strutils as strutils
from...import...語句
若是你只想導入某一個模塊的指定符號,那麼你就可使用這種語句
來看下面的代碼:
from strutils import `%` echo "$1" % "abc" # 但開發人員仍是能夠用徹底限定符調用這個模塊的其餘方法: echo strutils.replace("abc", "a", "z")
若是你想迫使開發人員必須在主調模塊中使用徹底限定符來調用被調模塊的符號
那麼你可使用,下面這種方法
rom strutils import nil
Export語句
下來看下面三個模塊的代碼
# module B type MyObject* = object
# module A import B export B.MyObject proc `$`*(x: MyObject): string = "my object"
# module C import A # B.MyObject has been imported implicitly here: var x: MyObject echo($x)
模塊A把模塊B中的符號導出出來了
這樣模塊C就不用再導入模塊B了