Nim教程【九】
向关注这个系列的朋友们,道一声:久违了!
它并没有被我阉掉,他一定会得善终的,请各位不要灰心
Set集合类型
为了在特殊场景下提高程序的性能设置了Set类型,同时也是为了保证性能,所以Set只能容纳有序类型,
Set类型可以被一个大括号实例化:
var x = {},x就是一个空的set类型
还可以在大括号构造符号内部填写set变量内部的元素,或一组元素
就像下面的代码一样
type
CharSet = set[char]
var
x: CharSet
x = {'a'..'z', '0'..'9'}
可以用于Set类型的操作符
| 操作符 | 含义 |
| A + B | union操作,链接两个Set变量 |
| A * B | 得到两个集合的交集 |
| A - B | 得到两个集合的差异(A中哪些元素是B所不包含的) |
| A == B | 判断两个集合是否相等 |
| A <= B | A是否与B相等或者A是否是B的子集 |
| A < B | A是否是B的子集 |
| e in A | A包含元素e |
| e notin A | A不包含元素e |
| contains(A,e) | A包含元素e |
| Card(A) | A中包含多少个元素 |
| incl(A,e) | 与A = A + {e}相同 |
| excl(A,e) | 与A = A - {e}相同 |
Array数组类型
数组是一个固定长度的容器
数组中的每个元素必须类型相同
数组可以使用方括号构造
请看下面的代码
type
IntArray = array[0..5, int] # an array that is indexed with 0..5
var
x: IntArray
x = [1, 2, 3, 4, 5, 6]
for i in low(x)..high(x):
echo(x[i])
代码中x[i]的意思是访问数组x的第i个元素
nim语言会对数组访问执行边界检查
你通过开关的形式来设置:到底是在编译期执行边界检查,还是在运行期执行边界检查
(译注:我们这里就不讲怎么设置这个开关了)
数组是值类型的,像其他值类型一样,赋值操作将复制整个数组内容
len方法返回数组的长度
low方法返回数组的最小下标
high方法返回数组的最大下标
请仔细看一下下面的代码:
type
Direction = enum
north, east, south, west
BlinkLights = enum
off, on, slowBlink, mediumBlink, fastBlink
LevelSetting = array[north..west, BlinkLights]
var
level: LevelSetting
level[north] = on
level[south] = slowBlink
level[east] = fastBlink
echo repr(level) # --> [on, fastBlink, slowBlink, off]
echo low(level) # --> north
echo len(level) # --> 4
echo high(level) # --> west
可以用多个方括号来实现多维数组
在多维数组中,不同的纬度可以拥有不同的索引类型
来看一下下面的代码
type
Direction = enum
north, east, south, west
BlinkLights = enum
off, on, slowBlink, mediumBlink, fastBlink
LevelSetting = array[north..west, BlinkLights]
LightTower = array[1..10, LevelSetting]
var
tower: LightTower
tower[1][north] = slowBlink
tower[1][east] = mediumBlink
echo len(tower) # --> 10
echo len(tower[1]) # --> 4
echo repr(tower) # --> [[slowBlink, mediumBlink, ...more output..
# The following lines don't compile due to type mismatch errors
#tower[north][east] = on
#tower[0][1] = on
注意:len(tower)只返回第一维数组的长度
我们还可以通过下面的方式定义多维数组,(可读性更好一些)
type
LightTower = array[1..10, array[north..west, BlinkLights]]
还有一种简单的定义数组的方法,来看看下面的代码
type
IntArray = array[0..5, int] # an array that is indexed with 0..5
QuickArray = array[6, int] # an array that is indexed with 0..5
var
x: IntArray
y: QuickArray
x = [1, 2, 3, 4, 5, 6]
y = x
for i in low(x)..high(x):
echo(x[i], y[i])
从上面的代码中可以看出,定义数组的时候,不必每次都要指定数组的最小下标
seq序列类型
seq类型类似于数组,但seq类型可以在运行期改变容器的长度;
也正是因为seq是长度可变的,所以nim在内存堆上为它分配空间和进行垃圾收集
seq类型的索引总是从0开始的,
len、low、high操作同样适用于seq类型
可以通过x[i]访问seq类型的x变量的第i个元素
seq类型可以通过@和方括号来构造,也可以使用内置的newSeq方法来构造
请看下面的代码
var
x: seq[int] # a sequence of integers
x = @[1, 2, 3, 4, 5, 6] # the @ turns the array into a sequence
如果你没有为一个seq类型的变量赋值,那么它的默认值将为nil
在很多应用在seq变量的操作中,操作nil的话会抛出异常
所以很多人都会为seq类型的变量设置空值:@[]
但是设置空值的话,会在内存堆上创建一个空序列
一定程度上有损性能
请你自行斟酌权衡吧
用for语句遍历一个序列的时候,for语句中可以存在一个或两个变量
如果是一个变量的时候,
这个变量将持有每次迭代过程中seq提供的值
如果是两个变量的时候,
第一个变量将保存索引的位置
第二个变量将保存seq提供的值
请看下面的代码:
for i in @[3, 4, 5]:
echo($i)
# --> 3
# --> 4
# --> 5 for i, value in @[3, 4, 5]:
echo("index: ", $i, ", value:", $value)
# --> index: 0, value:3
# --> index: 1, value:4
# --> index: 2, value:5
今天就写到这里吧!
喜欢的人请帮忙点个推荐!
Nim教程【九】的更多相关文章
- CRL快速开发框架系列教程九(导入/导出数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 无废话ExtJs 入门教程九[数字字段:NumberField、隐藏字段Hidden、日期字段:DataFiedl]
无废话ExtJs 入门教程九[数字字段:NumberField.隐藏字段Hidden.日期字段:DataFiedl] extjs技术交流,欢迎加群(201926085) 继上第六节内容,我们在表单里加 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block 代理对象(Proxy Object) ...
- RabbitMQ入门教程(九):首部交换机Headers
原文:RabbitMQ入门教程(九):首部交换机Headers 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...
- WPF教程九:理解WPF中的对象资源
在WPF中,所有继承自FrameworkElement的元素都包含一个Resources属性,这个属性就是我们这篇要讲的资源. 这一篇讲解的资源是不是上一篇的程序集资源(那个是在编译过程中打包到程序集 ...
- 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 重写, 可以自定编译规则, 是静 ...
随机推荐
- CMake 使用方法(转)
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的 ...
- 搭建dns域名服务器过程
在用TCP/IP协议族架设的网络中,每一个节点都有一个唯一的IP地址,用来作为它们唯一的标志.然而,如果让使用者来记住这些毫无记忆规律的IP地址将是不可想象的.人们就需要一种有记忆规律的字符串来作为唯 ...
- 转:eclipse以及step into step over step return的区别
首先来讲一下step into step over step return的区别: step into就是单步执行,遇到子函数就进入并且继续单步执行:(F5) step over是在单步执行时,在函数 ...
- Android视图状态及重绘流程分析,带你一步步深入了解View(三)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17045157 在前面一篇文章中,我带着大家一起从源码的层面上分析了视图的绘制流程, ...
- nodeJS express框架 中文乱码解决办法
最近在研究javascript 的服务端应用 node,之所以想要研究node,是因为前几个月一直在前端挣扎,从javascript入门到在项目中实际使用javascript,确实感悟颇深.javas ...
- codeIgniter怎么实现对input type=text对话框blur事件的监听以及传值?
如题,这个问题怎么解决? 用JS和前端框架习惯了,现在学后端框架,感觉各种坑...
- 如何解决WebService参数传递中文乱码问题
1,问题由来 我的主要工作是负责统一适配平台这块,主要任务是提供给客户统一的调用接口,客户使用这个接口可以通过我们再调不同厂家的接口.主要流程如下: 现在客户那边传来的请求报文里面包含中文,使用web ...
- 浅谈城市规划在移动GIS方面的应用发展
1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...
- QT 第三方串口库COM10以上无法读取问题
当COM口的端口号高于9时,也就是说从COM10往后,serialPortName赋值就不能跟COM1~~COM9一样,C++中COM大于9时,COM前面需要加上\\.\COM. 如,serialPo ...
- 黑马程序员-autorelease pool
Autorelease:可以延迟给对象发送release消息.发送一个autorelease消息给对象,证明该对象在一定时间内有效,一定时间后会对该对象进行释放,进行一次release. 一个auto ...