引用和指针类型

引用(类似于其他编程语言中的指针)是引入多对一关系的一种方式。这意味着不同的引用可以指向并修改内存中的相同位置(也称为 aliasing “别名”)。

Nim 区分 traced “追踪”、untraced “未追踪” 引用。未追踪引用也叫 指针 。 追踪引用指向垃圾回收堆中的对象,未追踪引用指向手动分配对象或内存中其它位置的对象。 因此,未追踪引用是 不安全 的。然而对于某些访问硬件的低级操作,未追踪引用是不可避免的。

使用 ref 关键字声明追踪引用,使用 ptr 关键字声明未追踪引用。通常, ptr T 可以隐式转换为 pointer 类型。

空的下标 [] 表示法可以用来取代引用, addr 过程返回一个对象的地址。地址始终是未追踪的引用。因此, addr 的使用是 不安全的 功能。

. (访问元组和对象字段运算符)和 [] (数组/字符串/序列索引运算符)运算符对引用类型执行隐式解引用操作:

  1. type
  2. Node = ref NodeObj
  3. NodeObj = object
  4. le, ri: Node
  5. data: int
  6. var
  7. n: Node
  8. new(n)
  9. n.data = 9
  10. # 不必写 n[].data; 非常不推荐 n[].data!

为了简化结构类型检查,递归元组无效:

  1. # 无效递归
  2. type MyTuple = tuple[a: ref MyTuple]

同样, T = ref T 是无效类型。

作为语法扩展,如果在类型部分中通过 ref object 或 ptr object 符号声明,则 object 类型可以是匿名的。当一个对象只能获得引用语义时,这个特性很有用:

  1. type
  2. Node = ref object
  3. le, ri: Node
  4. data: int

要分配一个新的追踪对象,必须使用内置的过程 new 。可以使用过程 alloc , dealloc 和 realloc 来处理未追踪的内存。 更多信息,查看系统模块文档。