openarray类型

注意:openarray类型只能用于参数

固定大小的数组虽然性能不错,但过于呆板,使用取来不是很方便

对于一个方法来说,传入参数如果是一个数组,最好是不要限制数组的长度

也就是说,方法应该能够处理不同大小的数组

openarray类型就是为了满足这样的要求而设计的

openarray类型的变量索引总是从0开始

len、low、high等操作同样试用于openarray类型

原则上,任何一个数组都可以被传递到一个openarray参数中,索引的类型并不重要

但是一定要注意:不能给openarray类型的参数传递多维数组

可变数量的参数

一个可变数量的参数就是一个openarray参数

他可以让开发者传递多个同一类型的参数给一个方法

编译器自动将这些参数转换为一个openarray数组

proc myWriteln(f: File, a: varargs[string]) =
  for s in items(a):
    write(f, s)
  write(f, "\n") myWriteln(stdout, "abc", "def", "xyz")
# is transformed by the compiler to:
myWriteln(stdout, ["abc", "def", "xyz"])

需要注意的是:这种类型的参数必须是方法签名的最后一个参数

另外,你可以通过下面这种方式来动态转换传入的参数的类型

proc myWriteln(f: File, a: varargs[string, `$`]) =
  for s in items(a):
    write(f, s)
  write(f, "\n") myWriteln(stdout, 123, "abc", 4.0)
# is transformed by the compiler to:
myWriteln(stdout, [$123, $"def", $4.0])

在这个例子中,$应用于任何参数,

(注意:$应用于字符串时,是一个nop操作)

(译者注:这个语言特性非常像C#里的param关键字)

slice类型

slice类型和subranges类型很相似

但这两个类型的使用场景不尽相同

在实际的业务控制代码中slice类型并不是很常用

但在很多集合类型的操作中,slice起到定义操作数的作用

请看下面的代码:

var
  a = "Nim is a progamming language"
  b = "Slices are useless." echo a[7..12] # --> 'a prog'
b[11.. -2] = "useful"
echo b # --> 'Slices are useful.'

在上面的例子中,slice类型被用于修改一个字符串的一部分

在上面的例子中,-2是一个负数索引(倒数第二个字符)

理论上slice可以容纳任何类型的数据

但是如果slice用于方法的签名中,则必须明确slice容纳的数据类型

Tuple元组类型

Tuple元组类型定义了一系列的有序的属性

可以使用方括号来定义元组,

使用小括号来构造元组,

构造器中属性的顺序必须和元组定义的属性的顺序一致

如果两个元组在定义的时候,使用了相同的属性而且属性的顺序也是一致的

那么这两个元组就是相同的

可以使用t.field来访问一个元组的某个属性

也可以使用t[i]来访问一个元组的第几个属性

来看下面的代码:

type
  Person = tuple[name: string, age: int] # type representing a person:
                                         # a person consists of a name
                                         # and an age
var
  person: Person
person = (name: "Peter", age: 30)
# the same, but less readable:
person = ("Peter", 30) echo(person.name) # "Peter"
echo(person.age)  # 30 echo(person[0]) # "Peter"
echo(person[1]) # 30 # You don't need to declare tuples in a separate type section.
var building: tuple[street: string, number: int]
building = ("Rue del Percebe", 13)
echo(building.street) # The following line does not compile, they are different tuples!
#person = building
# --> Error: type mismatch: got (tuple[street: string, number: int])
#     but expected 'Person' # The following works because the field names and types are the same.
var teacher: tuple[name: string, age: int] = ("Mark", 42)
person = teacher

从上面的代码中,大家可以看出

在使用tuple类型的时候,不一定要新创建一个类型出来

上面的代码中的building变量就直接使用了tuple类型,而不像person一样先创建了一个Person类型

只有在元组属性赋值期间元组才可以被拆箱(这里不知道翻译的对不对,原文:Tuples can be unpacked during variable assignment (and only then!).)

os模块的内置splitFile方法,可以返回三个值,一个是路径,一个是文件名,一个是文件扩展名

这个时候就可以应用这个特性

import os

let
  path = "usr/local/nimc.html"
  (dir, name, ext) = splitFile(path)
  baddir, badname, badext = splitFile(path)
echo dir      # outputs `usr/local`
echo name     # outputs `nimc`
echo ext      # outputs `.html`
# All the following output the same line:
# `(dir: usr/local, name: nimc, ext: .html)`
echo baddir
echo badname
echo badext

上面的代码第一次输出和第二次输出是一样的

只有使用var或者let操作符时,才可以应用元组解包的特性

下面的代码编译不会通过的

import os

var
  path = "usr/local/nimc.html"
  dir, name, ext = "" (dir, name, ext) = splitFile(path)
# --> Error: '(dir, name, ext)' cannot be assigned to

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

谢谢大家

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

  1. CRL快速开发框架系列教程十二(MongoDB支持)

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

  2. CRL快速开发框架系列教程十(导出对象结构)

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

  3. 无废话ExtJs 入门教程十九[API的使用]

    无废话ExtJs 入门教程十九[API的使用] extjs技术交流,欢迎加群(201926085) 首先解释什么是 API 来自百度百科的官方解释:API(Application Programmin ...

  4. 无废话ExtJs 入门教程十六[页面布局:Layout]

    无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distributi ...

  5. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

  6. 无废话ExtJs 入门教程十四[文本编辑器:Editor]

    无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功 ...

  7. 无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two]

    无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two] extjs技术交流,欢迎加群(201926085) 不管是几级下拉列表的联动实现本质上都是根据某个下拉列表的变化,去动态加载其 ...

  8. 无废话ExtJs 入门教程十[单选组:RadioGroup、复选组:CheckBoxGroup]

    无废话ExtJs 入门教程十[单选组:RadioGroup.复选组:CheckBoxGroup] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个一个单选组,一个复 ...

  9. Unity3D脚本中文系列教程(十六)

    Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆  function OnPostprocess ...

  10. Unity3D脚本中文系列教程(十五)

    http://dong2008hong.blog.163.com/blog/static/4696882720140322449780/ Unity3D脚本中文系列教程(十四) ◆ LightRend ...

随机推荐

  1. 《笨办法学C》笔记之Makefile

    使用gcc编译C语言源码 在Linux系统中,C语言源码需要用gcc编译为二进制可执行文件,才能够运行. $ gcc test.c -o test 这句命令就将test.c文件编译为test二进制可执 ...

  2. c# Exception 异常信息归整

    private string ErrorMessage(Exception exception) { StringBuilder stringBuilder = new StringBuilder() ...

  3. Mac Virtual System On Windows

    Win8.1下利用虚拟机安装苹果操作系统 所需文件: 虚拟机:VMware -10.0.1,这个就是中文版的了. 虚拟机密钥生成器:vm10keygen,要对应虚拟机的版本. 虚拟机的插件: unlo ...

  4. Mac 系统下的环境变量

    1.查看电脑环境变量   -->echo $PATH 2. 新建环境变量   sudo vim ~/.bash_profile  输入密码 3. 按 I ,编辑新的环境变量地址,保存 退出 :w ...

  5. linux环境下部署tomcat

    服务器环境:Red Hat Enterprise Linux Server release 6.5 安装部署包:apache-tomcat-8.0.30.tar.gz.jdk-8u66-linux-x ...

  6. 《UML大战需求分析》阅读笔记6

    流程分析三剑客之总结 顺序图,活动图相类似表示活动,状态机图表示状态.分析特点: 顺序图: 强调角色之间的交互,信息明确: 从上到下,从左到右,按时间顺序: 不适合表达复杂特殊情况(循环分支,条件分支 ...

  7. jsp实现回车登录

    <body onkeydown="if(event.keyCode==13){login()}"> 内容0...... </body> 注:body里面加上 ...

  8. 断言(ASSERT)的用法

    ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行.如果表达式不为0,则继续执行后面的语句.这个宏通常原来判 ...

  9. 【Thinking in Java】类和对象的初始化过程

    在Java中, 当一个类被调用的时候,它的初始化过程是怎么样的呢? 当一个类被实例化的时候,它的初始化过程又是怎样的呢? 为什么static方法不能未经对象就调用非static方法? 下面我们通过例子 ...

  10. [spark案例学习] 单词计数

    数据准备 数据下载:<莎士比亚全集> 我们先来看看原始数据:首先将数据加载到RDD,然后显示数据框的前15行. shakespeareDF = sqlContext.read.text(f ...