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

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

时间: 2024-10-22 12:37:20

Nim教程【七】的相关文章

Swift中文教程(七)--协议,扩展和泛型

Protocols and Extensions 协议(接口)和扩展 Swift使用关键字protocol声明一个协议(接口): 类(classes),枚举(enumerations)和结构(structs)都可采用协议(protocol): 1 class SimpleClass: ExampleProtocol { 2 var simpleDescription: String = "A very simple class." 3 var anotherProperty: Int

ASP.NET 5系列教程(七)完结篇-解读代码

在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]")] 所有符合该模板类型的HTTP 请求都会被路由到该controller.在本例中, 路由的命名规范为对应Controller 的前缀,对于TodoController 类,路由模板为 “api/todo”. HTTP 方法 [HttpGet].[HttpPost]和[HttpDelete] 属性定义为 co

Laravel教程 七:表单验证 Validation

Laravel教程 七:表单验证 Validation 此文章为原创文章,未经同意,禁止转载. Laravel Form 终于要更新这个Laravel系列教程的第七篇了,期间去写了一点其他的东西. 就不 说废话了吧,直接进入Form Validation的部分吧.几乎在每一个web应用当中都会有表单,而有表单基本就离不开表单验证.在laravel中,其实可以说是有两种方式来进行表单验证:使用Request和使用Validation.下面将分开讲这两部分的内容,而且我会更着重第一种,也更推荐大家使

无废话ExtJs 入门教程七[登陆窗体Demo:Login]

无废话ExtJs 入门教程七[登陆窗体Demo:Login] extjs技术交流,欢迎加群(201926085) 在这节我们通过前几节讲的内容做一个登陆页面,把前几节讲的内容贯穿一下. 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 &l

webpack4 系列教程(七): SCSS提取和懒加载

教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)webpack4 系列教程(七): SCSS 提取和懒加载. 个人技术小站: https://godbmw.com 有空就来看看, 我一直都在 本节课讲解在webpack v4中的 SCSS 提取和懒加载.值得一提的是,v4和v3在 Scss 的懒加载上的处理方法有着巨大差别. >>> 本节课源码 >>> 所有课程源码 1. 准备工作 关于 SCSS 处理的基础,请参考w

RabbitMQ入门教程(七):主题交换机Topics

原文:RabbitMQ入门教程(七):主题交换机Topics 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78631035 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 本节主要演示交换机的另一种类型:主题类型topic,直连接类型direct必须是生产者发布消息指定的routingKey和消费者

Nim教程【十四】

网友@沉没捕鱼,赞助了一台服务器 这个系列的教程写完之后,我们就要开始着手搭建Nim的社区了~ 异常 Nim中的异常类型是对象类型 根据惯例,Nim中的异常类型的命名都应该以Error后缀结尾 在system模块中定义了异常类型的基类 所有的异常都应该派生自system.Exception类型 由于我们不清楚异常对象的生命周期, 所以必须在内存堆上为异常的实例分配空间 编译器不允许开发人员在栈上为异常分配空间 你如果想抛出一个异常,你必须为这个异常的msg属性赋值 按照约定,只有在非常特殊的情况

Nim教程【四】

这是国内第一个关于Nim的系列教程 先说废话 不得不说Rust也是门不错的语言,园子里 有人曾经说: Rust语言除了library或keyword缩写比较恶心以外其他所有地方完爆go 还有人曾这样评价Rust语言 Rust 可以说是 D 语言二代目,  没有 D 里的一些经验主义设计,  而且更函数式,  作为 a better C++ 当之无愧.  Pattern matching, Block, Generic 这些东西, Go 有么?  不好的地方是集成 feature 略贪心,  指针

Nim教程【二】

第一篇教程1秒内就被管理员从首页踢掉了 管理员嫌内容太少,没有含金量,这次多写一些. 这应该是国内第一个关于Nim入门的系列教程 好,闲话休提,言归正传 Nim介绍 Nim代码会编译成C语言的代码,再编译成本地机器码,不依赖于虚拟机, 而且生成的可执行文件比较小,不依赖于其他库,分发起来比较方便 拥有一个“非追踪式”的垃圾收集器,这就非常适用于类似游戏这样的“弱实时”系统 让程序员拥有直接操纵内存和访问硬件的权力(手动管理的内存有别于垃圾收集器可收集的内存) 零开销的迭代器 Cross-modu