排除指定符号

一般情况下使用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

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

Nim教程【十二】的更多相关文章

  1. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. 无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two]

    无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two] extjs技术交流,欢迎加群(201926085) 不管是几级下拉列表的联动实现本质上都是根据某个下拉列表的变化,去动态加载其 ...

  3. webpack4 系列教程(十二):处理第三方JavaScript库

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十二):处理第三方 JavaScript 库>原文地址.或者来我的小站看更多内容:godbm ...

  4. RabbitMQ入门教程(十二):消息确认Ack

    原文:RabbitMQ入门教程(十二):消息确认Ack 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csd ...

  5. WebGL简易教程(十二):包围球与投影

    目录 1. 概述 2. 实现详解 3. 具体代码 4. 参考 1. 概述 在之前的教程中,都是通过物体的包围盒来设置模型视图投影矩阵(MVP矩阵),来确定物体合适的位置的.但是在很多情况下,使用包围盒 ...

  6. Nim教程【二】

    第一篇教程1秒内就被管理员从首页踢掉了 管理员嫌内容太少,没有含金量,这次多写一些. 这应该是国内第一个关于Nim入门的系列教程 好,闲话休提,言归正传 Nim介绍 Nim代码会编译成C语言的代码,再 ...

  7. WPF教程十二:了解自定义控件的基础和自定义无外观控件

    这一篇本来想先写风格主题,主题切换.自定义配套的样式.但是最近加班.搬家.新租的房子打扫卫生,我家宝宝6月中旬要出生协调各种的事情,导致了最近精神状态不是很好,又没有看到我比较喜欢的主题风格去模仿的, ...

  8. Redis教程(十二):服务器管理命令总结

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/140.html 一.概述: Redis在设计之初就被定义为长时间不间断运行 ...

  9. struts2.1.6教程十二、总结

    本教程对struts2的基本知识进行了一些说明,关于struts2的更多详细内容应参看struts2的官方文档及提供的app实例. 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官 ...

  10. Spring Boot系列教程十二:Spring boot集成Redis

    一.创建项目 项目名称为 "springboot_redis",创建过程中勾选 "Web","Redis",第一次创建Maven需要下载依赖 ...

随机推荐

  1. 解决Visual Studio 2010闪退问题

    许多人都会面临这样的问题,vs2010闪退,明明程序执行成功,明明没有错误,缺闪了一下结束. 闪退问题主要是缓存的问题,通过在程序末尾,即main函数后增加 getchar(); getchar(); ...

  2. angularjs 作用域

    1.指令属性取值:通过attr.someAttribute属性名字获取 以下,通过$eval(attr.data)获取value <div ng-controller="personC ...

  3. android系统启动

    首页 资讯 精华 论坛 问答 博客 专栏 群组 更多 ▼ 您还未登录 ! 登录 注册 Ant space   博客 微博 相册 收藏 留言 关于我     android启动过程再研   Androi ...

  4. matlab 快捷键

    注释快捷键 ctrl + R 取消注释快捷键 ctrl + T 手动注释使用 % 连接两行(一行代码太长) 使用 ...

  5. POJ 2151 Check the difficulty of problems (概率DP)

    题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...

  6. tomee 消息持久化

    http://tomee.apache.org/jms-resources-and-mdb-container.html http://activemq.apache.org/xml-configur ...

  7. [UCSD白板题] Binary Search

    Problem Introduction In this problem, you will implemented the binary search algorithm that allows s ...

  8. xUtils 中的BitmapUtils 全面注释

    /** * 加载图片工具类 * @author afu * */ public class BitmapUtils implements TaskHandler { /** * 判断任务是否暂停 */ ...

  9. (期望)A Dangerous Maze(Light OJ 1027)

    http://www.lightoj.com/volume_showproblem.php?problem=1027 You are in a maze; seeing n doors in fron ...

  10. JavaWeb 命名规则

    命名规范命名规范命名规范命名规范 本规范主要针对java开发制定的规范项目命名项目命名项目命名项目命名 项目创建,名称所有字母均小写,组合方式为:com.company.projectName.com ...