Nim教程【十二】
排除指定符号
一般情况下使用import语句,会把一个模块内的符号都导入进来
如果你像排除特定的符号(不想让某些符号被导入进来)
可以使用except子句
就像下面这样
1 | import mymodule except y |
这行代码排除了mymodule模块中的y符号,其他符号都导入了
如果想排除更多的符号,可以使用逗号分割
导入指定符号
我们还可以使用from语句来导入指定的符号
请看下面的代码:
1 | from mymodule import x, y, z |
上面的代码中,只导入了mymodule模块的x,y,z三个符号
强行名称空间限定
先来看看下面的代码
1 2 3 | from mymodule import x, y, z x() # use x without any qualification |
在上面的代码中,
当前模块使用x的时候没有任何限制,直接使用就可以,
就好像在当前模块定义的一样
但有些时候,开发人员是希望他带着名称空间一起使用的
from关键词与nil关键词结合可以实现这种限制
来看看下面的代码
1 2 3 4 5 | 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 |
有些时候模块名称挺长的
而又要使用名称空间限定的时候
就会带来很大的麻烦
这时,可以给模块名称起一个别名
请看下面的代码:
1 2 3 | from mymodule as m import nil m.x() # m is aliasing mymodule |
按这样的代码,就可以使用简短的模块别名作为名称空间了
include语句
include语句与from语句有着本质的区别
include语句在编译期把几个文件合并成一个文件
这有利于把一个大的文件分割成几个文件
1 | include fileA, fileB, fileC |
对象
在Nim中,对象和元组很像
对象也是把一系列不同的东西放到一起的一种方式
当对象还提供了很多元组没有的功能
对象提供了继承和信息隐藏
由于对象的封装特性,所以对象的构造方法只能用于对象的内部
(对象应该提供一个方法用于初始化对象,这就是构造器)
如果你想在运行期访问一个对象实例的类型
可以使用of操作符,比如下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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关键字来明确继承关系
注意:在设计上组合往往优于继承
自引用对象类型
对象、元组都可以塑造出相当复杂的类型(数据结构)
比如说自引用类型
请看如下代码:
1 2 3 4 5 6 7 8 9 10 | 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 |
好了,今天就写到这里,喜欢的朋友请帮忙点个推荐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统