Nim教程【七】
这是国内第一个关于Nim的系列教程
先说废话
很开心,在今天凌晨快一点多的时候拿到了
nim-lang.com;nim-lang.cn;nim-lang.net
这三个域名,到不是为了投资,准备用nim-lang.com做一个社区出来
不知道国内有没有人或者机构打算赞助这个事情的
整型
Nim语言中有10个整型类型
int;int8;int16;int32;int64;uint;uint8;uint16;uint32;uint64
默认的整型类型是int
可以使用尾缀的方式来设置整型的类型,就像下面的代码这样:
let
x = 0 # x 的类型是int
y = 0'i8 # y 的类型是int8
z = 0'i64 # z 的类型是int4
u = 0'u # u 的类型是intuint
由于整形类型经常被用于计算内存里的对象
所以整形的大小和指针的大小一样
常见的操作符
+ - * div mod < <= == != > >=
都可以用在整形身上
还有一些按位计算的操作符:
and or xor not
也可以用在整型身上
shl操作符可以完成左移位操作
shr操作符可以完成右移位操作
移位操作一般都会把目标当作无符号的整形来对待
因为移位操作往往会导致乘法或除法操作
针对无符号的操作数,操作符做做过二次封装,不会产生内存泄漏或溢出的问题
在表达式中使用不同类型的整型时,会导致类型转化
宽度比较小的类型会被转化成宽度比较大的类型
整形不会自动转化成浮点类型
同样,浮点类型也不会自动转化成整形
toInt方法和toFloat方法可以用来处理这两种类型转化操作
浮点类型
有三种浮点类型
float float32 float64
默认的浮点类型是float,在现在的Nim实现中,float类型总是64位的
也可以用尾缀的方式来设置浮点类型的宽度,看下面的代码:
var
x = 0.0 # x 的类型是float
y = 0.0'f32 # y 的类型是float32
z = 0.0'f64 # z 的类型是float64
+ - * / < <= == != > >=
以上这些操作符也可以用于浮点类型(遵从IEEE标准)
和整型类型一样,不同宽度的浮点类型出现在一个表达式中的时候
宽度较小的浮点类型将被格式化成宽度较大的浮点类型
整形不会自动转化成浮点类型
同样,浮点类型也不会自动转化成整形
toInt方法和toFloat方法可以用来处理这两种类型转化操作
类型转化
基本数据类型的关键字本身就是一个方法,可以用这些方法完成格式转化工作
就像下面的代码一样:
var
x: int32 = 1.int32 # same as calling int32(1)
y: int8 = int8('a') # 'a' == 97'i8
z: float = 2.5 # int(2.5) rounds down to 2
sum: int = int(x) + int(y) + int(z) # sum == 100
$操作符和repr方法
nim中的内置类型都可以用$操作符把数据格式化成字符串
但是对于一些高级类型,或者用户自定义的类型
$就无能为力了(除非你为这些类型重新定义了$操作符)
有些时候你只是想在调试的时候看看一个复杂类型的值
如果每次都要为这个复杂类型定义一个$操作符,那就太麻烦了
这个时候你可以使用repr方法
repr方法可以应用于任何类型,甚至自关联类型也没有问题
来看看下面的代码
var
myBool = true
myCharacter = 'n'
myString = "nim"
myInteger = 42
myFloat = 3.14
echo($myBool, ":", repr(myBool))
# --> true:true
echo($myCharacter, ":", repr(myCharacter))
# --> n:'n'
echo($myString, ":", repr(myString))
# --> nim:0x10fa8c050"nim"
echo($myInteger, ":", repr(myInteger))
# --> 42:42
echo($myFloat, ":", repr(myFloat))
# --> 3.1400000000000001e+00:3.1400000000000001e+00
注意在repr(mystring)的时候,他的内存地址也被输出出来了
关键字type
在Nim中,使用type关键字来定义一个类型,来看下面的代码:
type
biggestInt = int64 # biggest integer type that is available
biggestFloat = float64 # biggest float type that is available
对象类型和枚举类型也是通过type关键字定义的
枚举类型
一个枚举类型定义了一个有序的值序列
值序列中的每个值都是整型的
第一个值为0,第二个值是1,依次类推
一个枚举类型的变量只能被赋值为这个序列值中的一个
来看段代码:
type
Direction = enum
north, east, south, west var x = south # `x` is of type `Direction`; its value is `south`
echo($x) # writes "south" to `stdout`
上面代码中定义的变量x的类型是Direction
注意:最后一行代码输出的内容是south,而不是2,
如果使用ord方法的话,可以得到枚举变量的值
所有的与比较相关的操作符都可以用在枚举变量身上
可以使用点操作符来避免歧义,就像下面的代码一样:
var x = Direction.south
为了更好的兼容其他语言,枚举类型内定义的符号可以指定为特定的值
但是在你指定特定值的时候,一定要按大小顺序指定
如果你没有明确给定一个符号的值,那么这个符号的值就是他上一个符号的值再加1
来看一下下面的示例代码:
type
MyEnum = enum
a = 2, b = 4, c = 89
好,今天就写到这里,喜欢的人请点推荐!
Nim教程【七】的更多相关文章
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Laravel教程 七:表单验证 Validation
Laravel教程 七:表单验证 Validation 此文章为原创文章,未经同意,禁止转载. Laravel Form 终于要更新这个Laravel系列教程的第七篇了,期间去写了一点其他的东西. 就 ...
- 无废话ExtJs 入门教程七[登陆窗体Demo:Login]
无废话ExtJs 入门教程七[登陆窗体Demo:Login] extjs技术交流,欢迎加群(201926085) 在这节我们通过前几节讲的内容做一个登陆页面,把前几节讲的内容贯穿一下. 1.代码如下: ...
- ASP.NET 5系列教程(七)完结篇-解读代码
在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...
- webpack4 系列教程(七): SCSS提取和懒加载
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)webpack4 系列教程(七): SCSS 提取和懒加载. 个人技术小站: https://god ...
- (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)
NGUI系列教程七(序列帧动画) 今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还 ...
- RabbitMQ入门教程(七):主题交换机Topics
原文:RabbitMQ入门教程(七):主题交换机Topics 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...
- 【转】PyQt5系列教程(七)控件
PyQt5系列教程(七)控件 软硬件环境 Windows 10 Python 3.4.2 PyQt 5.5.1 PyCharm 5.0.4 前言 控件是PyQt应用程序的基石.PyQt5自带很多不 ...
- MeteoInfo-Java解析与绘图教程(七)_图层添加站点名称或区域名称
MeteoInfo-Java解析与绘图教程(七)_图层添加站点名称或区域名称 在上文说了用自动站的数据经过插值绘制色斑图,这种一般是在geoserver上叠加图片呈现,但遇到后端导出图片,我们又想添加 ...
随机推荐
- jQuery管理包装集笔记
size():返回包装集中元素的个数. get([n]):返回一个DOM元素或DOM元素数组(接受负值). toArray():将包装里的所有元素作为DOM元素数组返回. eq(n):获取包装集中与i ...
- Chrome 插件集推荐
在前端这个行业里面,浏览器担任着及其重要的角色.今天我们可以选择的浏览器有很多,Chrome,Firefox,IE,Safari… 为了能获得更佳的开发体验,大家更多地选择 Chrome.今天介绍下我 ...
- Linux分析日志获取最多访问的前10个IP
原文地址:http://xuqq999.blog.51cto.com/3357083/774714 apache日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问 ...
- xenomai for at91
http://www.at91.com/linux4sam/bin/view/Linux4SAM/RealTime#Xenomai
- 01-Swift 介绍
简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 几家欢喜,几家愁 愁者:只学Object-C的人 欢喜者: ...
- ssh整合,导入structs包后报错 getAnnotation(AnnotatedElement ae,Class<T> annotatetype)找不到
今天在整合ssh(spring-framework-3.2.5.RELEASE-dist+struts-2.3.15.3-all+hibernate-release-4.2.6.Final)环境的时候 ...
- c# GridView有关RowClick事件,可单击显示选中的row
//当前选定行 int i = this.gridView1.FocusedRowHandle; //选中行,列名为name的值 gridView1.GetRowCellDisplayText(i, ...
- navicat自动备份数据
1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业". 2.双击上面的可用任务,它就会到下面的列表 ...
- 用SYS_CONNECT_BY_PATH进行层级查询时的排序问题
用SYS_CONNECT_BY_PATH进行层级查询时, 对同一级别的节点进行排序,可以加order SIBLINGS by 子句实现 WITH N2 AS( SELECT n.ID, org.&qu ...
- Spring中获取数据库表主键序列
在程序开发中,我们经常有写数据库表的操作,数据表中经常带有主键自增序列,如何获取自增序列.spring中提供了相应的类 DataFieldMaxValueIncrementer. DataFieldM ...