引用和指针类型
引用(类似与其他编程语言中的指针)是一种介绍多对一关系的一种方法。这意味着不同的引用可以指向和修改相同的内存单元。
在nim中分为追踪引用和非追踪引用(反追踪)。非追踪引用也叫做指针。跟踪引用指向一个垃圾收集堆对象,反跟踪指向手动分配的对象或内存中其他地方的对象。因此反跟踪引用是不安全的。然而对于某些低级操作(访问硬件)反跟踪引用是不可避免的。
追踪引用用ref关键字声明,反追踪引用用ptr关键字声明。
空[]下标符号可以用于解参考一个引用,引用指向的检索项的意义。.(访问一个元组或者对象域操作)和[](数组/字符串/序列索引操作)操作符执行隐式解引用操作对于引用类型:
type
Node = ref NodeObj
NodeObj = object
le, ri: Node
data: int
var
n: Node
new(n)
n.data = 9
# no need to write n[].data; in fact n[].data is highly discouraged!
不推荐写n[].data
为了创建一个新的追踪对象,内置函数new()必须被使用。为了处理反追踪内存函数alloc(),dealloc(),realloc()函数可以使用。系统模块的文档包含更多的信息。
如果一个引用指向空,它的值为nil.
过程类型
一个程序类型是一个(有些抽象)程序的指针。空值是一个允许的程序类型变量的值。Nim用程序类型来实现功能编程技术。
Example:
proc echoItem(x: int) = echo(x)
proc forEach(action: proc (x: int)) =
const
data = [2, 3, 5, 7, 11]
for d in items(data):
action(d)
forEach(echoItem)
关于程序类型的一个微妙的问题是:程序的调用约定会影响类型的兼容性。只有具有相同调用约定的程序才具有兼容性。手册中列出了调用约定的不同。