Nim语言的模块化编程

前言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了

相关文章
相关标签/搜索