Nim教程【十二】

排除指定符号

一般情况下使用import语句,会把一个模块内的符号都导入进来

如果你像排除特定的符号(不想让某些符号被导入进来)

可以使用except子句

就像下面这样

import mymodule except y

这行代码排除了mymodule模块中的y符号,其他符号都导入了

如果想排除更多的符号,可以使用逗号分割

导入指定符号

我们还可以使用from语句来导入指定的符号

请看下面的代码:

from mymodule import x, y, z

上面的代码中,只导入了mymodule模块的x,y,z三个符号

强行名称空间限定

先来看看下面的代码

from mymodule import x, y, z

x()           # use x without any qualification

在上面的代码中,

当前模块使用x的时候没有任何限制,直接使用就可以,

就好像在当前模块定义的一样

但有些时候,开发人员是希望他带着名称空间一起使用的

from关键词与nil关键词结合可以实现这种限制

来看看下面的代码

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

有些时候模块名称挺长的

而又要使用名称空间限定的时候

就会带来很大的麻烦

这时,可以给模块名称起一个别名

请看下面的代码:

from mymodule as m import nil

m.x()         # m is aliasing mymodule

按这样的代码,就可以使用简短的模块别名作为名称空间了

include语句

include语句与from语句有着本质的区别

include语句在编译期把几个文件合并成一个文件

这有利于把一个大的文件分割成几个文件

include fileA, fileB, fileC

对象

在Nim中,对象和元组很像

对象也是把一系列不同的东西放到一起的一种方式

当对象还提供了很多元组没有的功能

对象提供了继承和信息隐藏

由于对象的封装特性,所以对象的构造方法只能用于对象的内部

(对象应该提供一个方法用于初始化对象,这就是构造器)

如果你想在运行期访问一个对象实例的类型

可以使用of操作符,比如下面的代码:

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关键字来明确继承关系

注意:在设计上组合往往优于继承

自引用对象类型

对象、元组都可以塑造出相当复杂的类型(数据结构)

比如说自引用类型

请看如下代码:

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

好了,今天就写到这里,喜欢的朋友请帮忙点个推荐

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nnngu

015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别

Class.forName() 与 ClassLoader.loadClass() 大家都知道是反射用来构造类的方法,但是他们的用法还是有一定区别的。 在讲区别...

26930
来自专栏小勇DW3

类加载过程中几个重点执行顺序整理

1、 JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区

35820
来自专栏转载gongluck的CSDN博客

Lua学习笔记

--Lua笔记-- --0.Lua开篇-- --http://www.cnblogs.com/stephen-liu74/archive/2012/06/11/...

67260
来自专栏coding

redis列表list类型详解

65120
来自专栏用户画像

浅析JAVA堆内存和栈内存的区别

堆内存:https://baike.baidu.com/item/%E5%A0%86%E5%86%85%E5%AD%98/7270805?fr=aladdin

20410
来自专栏余林丰

int类型和byte类型的强制类型转换

今天在读《Java网络编程》这本书的第二章 流 时,看到书中有一个地方关于int强制转换为byte类型时应注意的地方。这个地方有点细节,不过就应该把这种细节把握...

23850
来自专栏星回的实验室

Angularjs的回调

$q.reject() 方法是在你捕捉异常之后,又要把这个异常在回调链中传下去时使用:

7820
来自专栏mukekeheart的iOS之旅

Java基础——异常体系

在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示: ?    所有的异常都是由Throwable继承而来,在下一层立...

28570
来自专栏日常学python

详解Python中的__init__和__new__的区别

使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候。例如:

7110
来自专栏Redis源码学习系列

Redis源码学习之对象系统

在前面的文章中,我介绍了Redis的底层数据结构,但Redis对外提供的命令并没有直接使用它们,而是基于它们构建更高级的数据对象,总共包括5中对象类型,分别为【...

15330

扫码关注云+社区

领取腾讯云代金券