Nim教程【十一】
引用类型和指针类型
不同的引用可以只想和修改相同的内存单元
在nim中有两种引用方式,一种是追踪引用,另一种是非追踪引用
非追踪引用也就是指针,指向手动在内存中分配的对象;
追踪引用指向一个垃圾收集的对象;
非追踪引用是不安全的
然而对于一些低级操作(比如说访问硬件),非追踪引用是不可避免的
追踪引用用ref关键词声明
非追踪引用用ptr关键词声明
可以用[]来解包一个引用(访问一个元组或对象域时要用到)
请看下面的代码:
- type
- Node = ref NodeObj
- NodeObj = object
- le, ri: Node
- data: int
- var
- n: Node
- new(n)
- n.data = 9
- # no need to write n[].data; in fact n[].data is highly discouraged!
上面代码中最后一行,没必要写成n[].data
使用new()来创建一个新的追踪对象
可以使用alloc或dealloc或realloc函数处理非追踪对象
如果一个引用没有指向任何东西,那么他的值为nil
proc方法指针类型
方法类型是一个方法的指针
(译注:一般函数式的语言中都有这个特性哦)
方法类型的变量默认值为nil
来看一下下面的代码
- proc echoItem(x: int) = echo(x)
- proc forEach(action: proc (x: int)) =
- const
- data = [2, 3, 5, 7, 11]
- for d in items(data):
- action(d)
- forEach(echoItem)
模块
nim允许把一个程序分成若干个模块
一个模块就是一个文件
模块可以起到隐藏信息的作用(译注:面向对象的封装)
模块可以起到分开编译的作用
一个模块可以用import语句导入另一个模块的符号
在一个模块中,只有用星号标记的符号,才能导出给另一个模块
来看看下面的代码:
- # Module A
- var
- x*, y: int
- proc `*` *(a, b: seq[int]): seq[int] =
- # allocate a new sequence:
- newSeq(result, len(a))
- # multiply two int sequences:
- for i in 0..len(a)-1: result[i] = a[i] * b[i]
- when isMainModule:
- # test the new ``*`` operator for sequences:
- assert(@[1, 2, 3] * @[1, 2, 3] == @[1, 4, 9])
在这个模块文件中导出了变量x和方法*
在程序开始执行的时候就会执行模块的顶层语句,
程序员可以利用nim的这个特性来初始化一些复杂的数据结构
模块的内部可以通过使用isMainModule内置变量来判断当前模块是否为主模块
来看看下面两个模块的代码:
- # 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() # 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
模块的符号的书写要符合module.symbol的语法
如果一个符号在两个模块中都定义过了
而且第三个模块引用了这两个模块
来看看下面三个模块的代码:
- # Module A
- var x*: string
- # Module B
- var x*: int# Module C
- import A, B
- write(stdout, x) # error: x is ambiguous
- write(stdout, A.x) # no error: qualifier used
- var x = 4
- write(stdout, x) # not ambiguous: uses the module C's x
但这个规则并不适用于方法或迭代器
对于方法或迭代器来说,适用于重载的规则
来看看下面的代码:
- # Module A
- proc x*(a: int): string = $a# Module B
- proc x*(a: string): string = $a# Module C
- import A, B
- write(stdout, x(3)) # no error: A.x is called
- write(stdout, x("")) # no error: B.x is called
- proc x*(a: int): string = nil
- write(stdout, x(3)) # ambiguous: which `x` is to call?
Nim教程【十一】的更多相关文章
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 无废话ExtJs 入门教程十一[下拉列表:Combobox]
无废话ExtJs 入门教程十一[下拉列表:Combobox] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个一个下拉列表: 1.代码如下: 1 <!DOCT ...
- webpack4 系列教程(十一):字体文件处理
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十一):字体文件处理>原文地址.或者来我的小站看更多内容:godbmw.com 0. 课程介 ...
- RabbitMQ入门教程(十一):消息属性Properties
原文:RabbitMQ入门教程(十一):消息属性Properties 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- WPF教程十一:简单了解并使用控件模板
WPF教程十一:简单了解并使用控件模板 这一章梳理控件模板,每个WPF控件都设计成无外观的,但是行为设计上是不允许改变的,比如使用Button的控件时,按钮提供了能被点击的内容,那么自由的改变控件外观 ...
- Nim教程【十四】
网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在sy ...
- Nim教程【七】
这是国内第一个关于Nim的系列教程 先说废话 很开心,在今天凌晨快一点多的时候拿到了 nim-lang.com:nim-lang.cn:nim-lang.net 这三个域名,到不是为了投资,准备用ni ...
- Nim教程【六】
目前看来这是国内第一个关于Nim的系列教程 先说废话 Rust1.0已经发布了, 国内有一个人为这个事情写了一篇非常长的博客, 这篇文章我前几天草草的看了一下,只记得这位朋友追Rust的艰辛,其他内容 ...
- Nim教程【一】
这应该是国内第一个关于Nim入门的系列教程 什么是Nim 我们先来引述网友 Luikore的一段话: Nim 不是函数式的, 但 Nim 支持卫生宏, 可以做 AST 重写, 可以自定编译规则, 是静 ...
随机推荐
- EasyUI DataGrid getChecked/getSelections 获取不到数据
今天使用getChecked获取选择的行,结果总是获取一行数据,于是换用getSelections,结果还是一样,想起之前做的项目,把idField换了下,之后getChecked/getSelect ...
- Codeigniter 在Active Record中限制批量更新数目
今天手头电商项目有个需求是:将订单中的优惠券自动发放给买家,所以要只更新优惠券表中的某几行数据,查了手册和网络都没有解决办法. 一开始用循环和遍历来做都是错的,因为update语句一下就更新掉所有符合 ...
- C#匿名函数的坑
在for循环中catch索引 for (int i = 0; i < n; i++) { foo(() =>{ if (i == x) //这里的i始终都是最后一个... { //bala ...
- Windows Phone 8.1 新特性 - 控件之FlipView
本篇为大家介绍 Windows Phone 8.1 中新增的 FlipView 控件,它的中文名字叫做:翻转视图. 虽然听起来有点拗口,但是它的用途大家一定不会陌生.在 Windows Phone 8 ...
- storm入门(二):关于storm中某一段时间内topN的计算入门
刚刚接触storm 对于滑动窗口的topN复杂模型有一些不理解,通过阅读其他的博客发现有两篇关于topN的非滑动窗口的介绍.然后转载过来. 下面是第一种: Storm的另一种常见模式是对流式数据进行所 ...
- 转行IT行业的心路历程3
16年丝袜生意很差的一年,老板的态度也不好,大唐本地人太歧视外地人了.而且我干的不开心没有前途,不能体现自我价值,无论你怎么努力. IT技术行业却不是这样,只要你努力肯学习,一定会有回报的. 在16/ ...
- idea中maven报错:无效的目标发行版: 1.8
1.project.pom中修改版本 <maven.compiler.source>1.7</maven.compiler.source><maven.compiler. ...
- HashMap LinkedHashMap源码分析笔记
MapClassDiagram
- php数字补零的两种方法
在php中有两个函数——至少有两个是否有其他的我还不知道,能够实现数字补零,str_pad(),sprintf()详细如下 str_pad顾名思义这个函数是针对字符串来说的这个可以对指定的字符串填补任 ...
- 如何将APP部署在阿里云服务器
1,APP应用需要什么样的云服务器? 为了帮助大家了解如何使用阿里云云服务器及相关应用,阿里云的移动云团队开发了一个简单的APP应用:移动云相册,其中使用了ECS主要用作部署云相册的API服务(图片信 ...