Nim教程【六】

目前看来这是国内第一个关于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身上(这样干会触发一个异常)

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

        所以你自己做权衡吧!

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我有一个梦想

boost::function的用法

本片文章主要介绍boost::function的用法。 boost::function 就是一个函数的包装器(function wrapper),用来定义函数对...

308100
来自专栏大前端开发

ES6特性之:参数默认值

作为一个开发者,跟进行业步伐是非常需要的,不能躺在现有的知识和经验温床上做美梦。JavaScript的ES2015标准(即我们说的ES6)在2016年已经被广泛...

9240
来自专栏编程

Python函数之一切皆对象

今天我们要讲的是 对象 避免误会,常老师先澄清一下,这里面说的对象指的是object,不是你的lover,也不是你的sweetheart…… 有的小伙伴可能会觉...

20570
来自专栏和蔼的张星的图像处理专栏

413. 反转整数从低到高逐位处理

将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数)。 样例

10830
来自专栏我的博客

冒泡排序

原理: 1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元...

32650
来自专栏菜鸟前端工程师

JavaScript学习笔记006-作用域0类型转换

10520
来自专栏desperate633

LintCode 寻找峰值题目分析代码

相邻位置的数字是不同的 A[0] < A[1] 并且 A[n - 2] > A[n - 1] 假定P是峰值的位置则满足A[P] > A[P-1]且A[P] ...

9720
来自专栏JavaEE

Java面试题-01前言:面试题:总结:

19250
来自专栏带你撸出一手好代码

正则表达式「^」符号的正确理解方式

「^」这个符号在正则表达式的中的应用相信是所有程序员都掌握的, 因为它是正则表达式中最基础最常用的知识点。 它在正则表达式中表示两种不同的意义 01 表示匹配一...

29230
来自专栏用户2442861的专栏

Json概述以及python对json的相关操作

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScr...

8320

扫码关注云+社区

领取腾讯云代金券