Nim教程【十】
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教程【十】的更多相关文章
- CRL快速开发框架系列教程十二(MongoDB支持)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- CRL快速开发框架系列教程十(导出对象结构)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 无废话ExtJs 入门教程十九[API的使用]
无废话ExtJs 入门教程十九[API的使用] extjs技术交流,欢迎加群(201926085) 首先解释什么是 API 来自百度百科的官方解释:API(Application Programmin ...
- 无废话ExtJs 入门教程十六[页面布局:Layout]
无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distributi ...
- 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]
无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...
- 无废话ExtJs 入门教程十四[文本编辑器:Editor]
无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功 ...
- 无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two]
无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two] extjs技术交流,欢迎加群(201926085) 不管是几级下拉列表的联动实现本质上都是根据某个下拉列表的变化,去动态加载其 ...
- 无废话ExtJs 入门教程十[单选组:RadioGroup、复选组:CheckBoxGroup]
无废话ExtJs 入门教程十[单选组:RadioGroup.复选组:CheckBoxGroup] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个一个单选组,一个复 ...
- Unity3D脚本中文系列教程(十六)
Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆ function OnPostprocess ...
- Unity3D脚本中文系列教程(十五)
http://dong2008hong.blog.163.com/blog/static/4696882720140322449780/ Unity3D脚本中文系列教程(十四) ◆ LightRend ...
随机推荐
- jQueryAjax笔记
ajax优点:能在不刷新整个页面的前提下更新数据,使用户操作与服务器响应异步化. ajax缺点:破坏浏览器“前进”.“后退”按钮的正常功能,搜索引擎爬虫不能理解那些奇怪的JS代码和因此引起的页面内容的 ...
- 第二节(RequestMapping请求方式)学习尚硅谷-springmvc视频教程
项目中,创建测试类SpringMVCTest @Controller @RequestMapping("/springmvc1") public class SpringMVCTe ...
- 转载:JAVA中关于set()和get()方法的理解及使用
对于JAVA初学者来说,set和get这两个方法似乎已经很熟悉了,这两个方法是JAVA变成中的基本用法,也是出现频率相当高的两个方法. 为了让JAVA初学者能更好的理解这两个方法的使用和意义,今天笔者 ...
- C# 模拟上传图片
上传图片的格式一定要按规定的写,不然没办法正确上传的. 我在上传的时候就是值前面没有空一行,导致上传不成功,很纠结的错误. 我要模拟的是一个FLASH的上传控件,我开始用HttpAnalyze抓包是抓 ...
- webrtc进阶-信令篇-之三:信令、stun、turn、ice
webRTC支持点对点通讯,但是webRTC仍然需要服务端: . 协调通讯过程中客户端之间需要交换元数据, 如一个客户端找到另一个客户端以及通知另一个客户端开始通讯. . 需要处理NAT(网 ...
- Mono for android 如何动态添加View,线程内部如何更新UI.
貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...
- DUT Star Round2
A.Zeratu的军训游戏 Problems: 开灯问题,问无数次操作之后第n盏灯的状态 Analysis: cj:平方数有奇数个约数 Tags: Implementation B.Zeratud的完 ...
- JavaScript常用方法100种
1.输出语句:document.write(""); 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4. ...
- spring-aop学习
SpringAOP学习 author:luojie 1. AOP中的基本概念 AOP的通用术语,并非spring java所特有.很遗憾AOP的术语不是特别的直观.但如果让Spring java来 ...
- python模块及包的导入
一.模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".&q ...