目前看来这是国内第一个关于Nim的系列教程

先说废话

Rust1.0已经发布了,

国内有一个人为这个事情写了一篇非常长的博客

这篇文章我前几天草草的看了一下,只记得这位朋友追Rust的艰辛,其他内容都已经记不清楚了

我觉得,任何正向付出都是值得鼓励和尊敬的

这节不对其他语言做任何吐槽

就吐槽Nim本身,

Nim这个语言之前叫做Nimrod,意思是猎人,

是一个圣经里的人物,曾经做过国王,大概是英勇善战、威风八面的人物吧

关键是Nimrod这个单词的读音:['nɪmrɒd]

真是叫人担心啊,居然读作“尼玛的”!哈哈

(不过据说国内go语言圈里有一个人物在开发yin语言,我想名字的读音上也没有什么高下之分吧)

迭代器

先来看看我们上几篇博客提到的有关循环的代码

echo("Counting to ten: ")
for i in countup(1, 10):
  echo($i)

countup就是一个迭代器,他是怎么实现的呢?

先来看一个错误的例子

proc countup(a, b: int): int =
  var res = a
  while res <= b:
    return res
    inc(res)

这是不对的,因为对于一个方法来说,return之后就退出了这个方法,return有没有在循环体内部

那么我们看看正确的写法是怎样的

iterator countup(a, b: int): int =
  var res = a
  while res <= b:
    yield res
    inc(res)
    • 这并不是用proc声明的方法,而是用iterator声明的迭代器

    • 迭代器内部可以用yield关键字“迭代”返回某一个变量的值(很像C#)

    • 迭代器只能用在for循环中

    • 迭代器中不能包含return关键字

    • 方法中也不能包含yield关键字

    • 迭代器中并没有一个隐藏的result变量

    • 迭代器不支持递归

    • 迭代器不支持前置声明(这项要求将在未来的编译器中被删掉)

关于迭代器还有很多内容,我们将在后面的章节再聊

bool类型

bool类型有两个值:true和false

用在while,if ,elif,when这些流程控制语句中,用于判断是否满足条件

诸如:not,and,or,xor,<,<=,>,>=,!=,==这类操作符,计算的结果就是bool类型的值

来看个例子:

while p != nil and p.name != "xyz":
  # p.name is not evaluated if p == nil
  p = p.next

字符类型

关键字是char,这种类型占据一个字节,因此它不能表示一个UTF-8的字符,

但是它可以用于表示一个UTF-8字符的一部分,这么搞主要是为了提升性能。

for the overwhelming majority of use-cases,

the resulting programs will still handle UTF-8

properly as UTF-8 was specially designed for this(这一句不敢乱翻译)

用单引号包住一个字符,就可以为字符类型的变量设置值了

诸如==,<,>,<=,>=这些操作符,可以用来操字符类型

$操作符可以把一个字符类型格式化成字符串类型

字符类型不能和数字类型混淆,要想得到一个字符类型的“序数值”,请使用ord方法

把一个数字类型的值格式化成字符类型,请使用chr方法

字符串类型

字符串类型是一个mutable类型(可变类型),

因此,对于一个字符串的拼接操作来说,性能表现非常好;

Nim中的字符串类型是以\0结尾的(与C语言相似)

但Nim中的字符串类型还包含一个长度的属性(这样你取一个字符串的属性,就非常高效了)

这个属性不会计算字符串结尾的\0字符

你可以通过len方法获得一个字符串的长度,

另外,还有一个值得注意的地方:

if s[i] == 'a' and s[i+1] == 'b':

像这样的代码,是不用检测i+1是不是已经到了字符串的结尾的

也就是说,方位字符串的最后一个索引(\0位置的索引),不会有问题

赋值运算符会导致一个字符串被复制

你可以使用&运算符来链接两个字符串

(你也可以使用add运算符,来把一个字符串添加到另一个字符串的结尾)

字符串的比较是按字符串内的字符顺序做比较的

所有的比较操作符都可以用在字符串身上

按照惯例,所有的字符串都是UTF-8类型的字符串,但这并不是强制执行的

当你从一个二进制文件中读取数据的时候,他仅仅是一系列的字节

s[i]是指在i位置的字符char,而不是在i位置的unichar

string类型的变量默认值是nil,很多针对string类型的操作,都不能用在nil身上(这样干会触发一个异常)

如果你不希望这样,那么你最好用""来初始化你的字符串变量(但这会导致在堆上创建一个“”字符串变量)

所以你自己做权衡吧!

今天就写到这里,喜欢的人请帮忙点推荐!

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

  1. CRL快速开发框架系列教程六(分布式缓存解决方案)

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

  2. C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  3. 无废话ExtJs 入门教程六[按钮:Button]

    无废话ExtJs 入门教程六[按钮:Button] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个按钮“提交”与重置.如下所示代码区的第68行位置, butt ...

  4. [转]Android Studio系列教程六--Gradle多渠道打包

    转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...

  5. Android Studio系列教程六--Gradle多渠道打包

    Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...

  6. Laravel教程 六:表单 Forms

    Laravel教程 六:表单 Forms 此文章为原创文章,未经同意,禁止转载. Form laravel 5.2 之后请使用 laravelcollective/html 替换 illuminate ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block 开发人员经常编写需要安全功能的应用程序.这些应用程序 ...

  8. Swift中文教程(六)--枚举和结构

    原文:Swift中文教程(六)--枚举和结构 Enumerations 枚举 使用 enum 来创建一个枚举.跟Classes(类)和其他类型的命名方式一样,枚举也可以有Method(方法). enu ...

  9. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  10. webpack4 系列教程(六): 处理SCSS

    这节课讲解webpack4中处理scss.只需要在处理css的配置上增加编译scss的 LOADER 即可.了解更多处理css的内容 >>> >>> 本节课源码 & ...

随机推荐

  1. HMC V7.9.0升级至SP2版本

    补丁下载地址:http://www-933.ibm.com/support/fixcentral/ 选择补丁版本 MH01405是和ftp://ftp.software.ibm.com/softwar ...

  2. javascript:history.go()和History.back()的区别(转载)

    javascript:history.go()和History.back()的区别       <input type=button value=刷新 onclick="window. ...

  3. 1 Java线程的内存可见性

    Java内存的可见性 可见性: 一个线程对共享变量的修改,能够及时被其它线程看到 共享变量: 如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JM ...

  4. 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用

    关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用   工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...

  5. 配置nginx负载均衡

    配置nginx负载均衡 执行命令:vi /usr/local/nginx/sbin/nginx/conf/nginx.conf 修改为: worker_processes  2; events {   ...

  6. [转]为什么使用 Redis及其产品定位

    原文链接:http://www.infoq.com/cn/articles/tq-why-choose-redis 传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据 ...

  7. iOS 应用中有页面加载gif动画,从后台进入前台时就消失了

    解决办法: 在Appdelegate.m 里面有一个从后台进入前台所响应的方法,可以在该方法里post 一个通知,在加载动画里的页面接受通知,响应一定的方法即可 #pragma -mark 当程序进入 ...

  8. 安装文件制作工具Wix概念快速入门

    前言 Wix==Windows installer XML 顾名思议. 用于制作WINDOWS安装文件的XML格式的描述文件. 因为其实现方式为基于声明的方式,而非命令的方式. 特整理一下其相关的概念 ...

  9. office中通过宏添加快捷键

    把“Microsoft 公式 3.0”作为一个按钮放在 2013中的快速访问工具栏的方法 在使用office办公软件的过程中,因为有的人还在使用office2003版本,所以在使用高版本的office ...

  10. 一步一步安装hive

    安装hive 1.下载hive-0.11.0.tar.gz,解压; 2.下载mysql-connector-java-5.1.29-bin.jar并放到hive/lib/下: 3.配置hive/con ...