• 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

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

  • 相关阅读:
    Java面试题2(转)
    Java面试题1(转)
    RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总
    Java List与数组之间的转换
    JAVA面试题(3)
    JAVA面试题(2)
    JAVA面试题(1)
    SpringMVC 后台怎么获取前台jsp页面中file中的文件
    QMessageBox中按钮的汉化
    关于字符串的一些重要方法
  • 原文地址:https://www.cnblogs.com/liulun/p/4519815.html
Copyright © 2020-2023  润新知