向关注这个系列的朋友们,道一声:久违了!

它并没有被我阉掉,他一定会得善终的,请各位不要灰心

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教程【九】的更多相关文章

  1. CRL快速开发框架系列教程九(导入/导出数据)

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

  2. 无废话ExtJs 入门教程九[数字字段:NumberField、隐藏字段Hidden、日期字段:DataFiedl]

    无废话ExtJs 入门教程九[数字字段:NumberField.隐藏字段Hidden.日期字段:DataFiedl] extjs技术交流,欢迎加群(201926085) 继上第六节内容,我们在表单里加 ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block 代理对象(Proxy Object) ...

  4. RabbitMQ入门教程(九):首部交换机Headers

    原文:RabbitMQ入门教程(九):首部交换机Headers 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...

  5. WPF教程九:理解WPF中的对象资源

    在WPF中,所有继承自FrameworkElement的元素都包含一个Resources属性,这个属性就是我们这篇要讲的资源. 这一篇讲解的资源是不是上一篇的程序集资源(那个是在编译过程中打包到程序集 ...

  6. Nim教程【十四】

    网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在sy ...

  7. Nim教程【七】

    这是国内第一个关于Nim的系列教程 先说废话 很开心,在今天凌晨快一点多的时候拿到了 nim-lang.com:nim-lang.cn:nim-lang.net 这三个域名,到不是为了投资,准备用ni ...

  8. Nim教程【六】

    目前看来这是国内第一个关于Nim的系列教程 先说废话 Rust1.0已经发布了, 国内有一个人为这个事情写了一篇非常长的博客, 这篇文章我前几天草草的看了一下,只记得这位朋友追Rust的艰辛,其他内容 ...

  9. Nim教程【一】

    这应该是国内第一个关于Nim入门的系列教程 什么是Nim 我们先来引述网友 Luikore的一段话: Nim 不是函数式的, 但 Nim 支持卫生宏, 可以做 AST 重写, 可以自定编译规则, 是静 ...

随机推荐

  1. B-Tree 学习

    算法导论 第18章 B树与其他树的结构不同的是  B数是多叉而不是二叉树 而且分叉因子很大一般使用于数据库 针对需要硬盘IO的情况而使用 可以降低磁盘IOB树的一个节点是以磁盘的页面为单位,而不是数据 ...

  2. s1=s1+1与s1+=1的区别

    刚看到一面试题,题目是这样的:short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错? 初看之下就是s1=s1+1和s1+=1的区别.在开发中我们基本上是使用后一种 ...

  3. freeCodeCamp:Caesars Cipher

    让上帝的归上帝,凯撒的归凯撒. 下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码. 移位密码也就是密码中的字母会按照指定的数量来做移位. 一个常见的案例就是ROT13密码,字母 ...

  4. 【笔记】memorymanagement-whitepaper-150215

    3 GC概念 Gc的职责: 1)  分配内存 2)  保证被引用的对象驻留内存 3)  对象不可达后将其占用内存回收 被引用对象被称为 “存活对象”. 不再被引用的对象称为“垃圾对象”. 找到垃圾对象 ...

  5. ros学习笔记 - 深度传感器转换成激光数据(hector_slam)

    前提条件:1,确保读者已经安装了kinect或者其他深度摄像头的驱动,如果未安装,可以直接在网盘下载:http://pan.baidu.com/s/1hqHB10w 提取密码:wrmn 利用深度相机仿 ...

  6. JS-offsetParent定位父节点

    offsetParent:离当前元素最激动呢一个有定位的父节点 如果没有定位父级,默认是body IE7以下如果当前元素没有定位默认是body,如果有定位就是html IE7以下,如果当前元素的某个父 ...

  7. backbone框架思路

    Backbone是MVC框架.如何使用这个框架来简化前端过程呢?作为一个初学者,虽然网上有它的官方文档,但是都是讲的一些方法,思路分析的却对初学者来说,看得晕乎乎的.现在就把自己对这个框架的理解记录在 ...

  8. 数据快照 (Database Snapshot)

    数据库快照是指数据库某一指定时刻的情况,数据库快照提供了源数据库在创建快照时刻的只读,静态视图 . 数据库快照一旦创建就不会改变. 数据库快照在被数据库所有者显示删除前始终存在. 数据库快照用途: 快 ...

  9. Mini projects #4 ---- Pong

    课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...

  10. Ubuntu下设置(增加/删除)开机启动项

    As said above, you have to edit /etc/xdg/autostart/ and either: remove the NoDisplay=true lines; or ...