Nim語言的模塊化編程


前言

Nim支持把一大段程序分成若干個模塊

一個模塊就是一個源代碼文件

每個模塊都擁有它自己的名稱空間

模塊化可以起到封裝(信息隱藏)和分步編譯的作用

 

一個模塊可以通過import語句獲得另一個模塊的符號

nim語言允許模塊間的循環引用,

只有用星號(*)標記的頂級符號才會被導出給其他模塊。

模塊名和文件名相同,模塊名的命名方式和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了


免責聲明!

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



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