前言

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了

Nim语言的模块化编程的更多相关文章

  1. 嵌入式C语言之---模块化编程

    当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干.你需要和你的小组成员分工合作,一起完成项目,这就要求小组成员各自负责一部分工程.比如你可能只是负责通讯或者显示这一块.这个时候,你就应 ...

  2. Javascript模块化编程之难处

    接着上一篇“Javascript模块化编程之Why”说起,Javascript担子重了之后程序也就复杂了.在大把语言都模块化编程的形势下,Javascript也不可能袖手旁观啊,毕竟这是一条经过实践检 ...

  3. 单片机 C 语言模块化编程

    好的开始是成功的一半 通过上一章的学习,我想你已经掌握了如何在程序中释放CPU了.希望能够继续坚持下去.一个良好的开始是成功的一半.我们今天所做的一切都是为了在单片机编程上做的更好. 在谈论今天的主题 ...

  4. 【C语言探索之旅】 第二部分第一课:模块化编程

    内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...

  5. c语言模块化编程

    C语言模块化编程(封装) 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明.模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c文件,然后把该模块的接口函 ...

  6. keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧! 后来学会了在keil里进行模块化编程,即只把功能相同或 ...

  7. Javascript模块化编程(三):require.js的用法

    Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...

  8. Javascript模块化编程(二):AMD规范

    Javascript模块化编程(二):AMD规范   作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_d ...

  9. Javascript模块化编程(二):AMD规范(转)

    这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...

随机推荐

  1. 两种方法实现用CSS切割图片只取图片中一部分

    切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已,主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性.下面有个不错的示例,大家可以参考下 切割图片这里不是真正的切割,只是用 ...

  2. RHEL7关于时间的学习笔记

    当你发现时间是贼了,它早已偷光你的选择. 一,GMT.UTC.CST GMT:(Greenwich Mean Time)格林威治时间 ,太阳通过格林威治那一刻来作为计时标准. UTC:(Coordin ...

  3. [php-src]窥探Php内核中的数组与面向对象

    内容均以php5.6.14为例. 扩展中定义一个类有以下四步: #1. 声明一个存储类信息的指针. zend_class_entry *errs_ce; #2. 定义方法的参数信息,类的方法实现. Z ...

  4. Android安全之Intent Scheme Url攻击

    0X01 前言 Intent scheme url是一种用于在web页面中启动终端app activity的特殊URL,在针对intent scheme URL攻击大爆发之前,很多android的浏览 ...

  5. 添加Properties取值和枚举取值

    <!--配置文件--><property name="ppp"> <props> <prop key="11"> ...

  6. SparkContext的初始化(季篇)——测量系统、ContextCleaner及环境更新

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  7. Java程序员从笨鸟到菜鸟之(一百零一)sql注入攻击详解(二)sql注入过程详解

    在上篇博客中我们分析了sql注入的原理,今天我们就来看一下sql注入的整体过程,也就是说如何进行sql注入,由于本人数据库和网络方面知识有限,此文章是对网上大量同类文章的分析与总结,其中有不少直接引用 ...

  8. SQL事物隔离级别

    标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...

  9. Java学习笔记 01 基本数据类型、标识符、关键字和运算符

    一.基本数据类型 基本数据类型 数据类型 内存空间(8位等于1字节) 取值范围 备注 byte 8位 -128~127   short 16位 -32768~32767   int 32位 -2147 ...

  10. 【Android UI】:Fragment官方文档

    概述   Fragment表现Activity中UI的一个行为或者一部分.可以将多个fragment组合在一起,放在一个单独的activity中来创建一个多界面区域的UI,并可以在多个activity ...