引用和指针类型
引用(类似于其他编程语言中的指针)是引入多对一关系的一种方式。这意味着不同的引用可以指向并修改内存中的相同位置(也称为 aliasing “别名”)。
Nim 区分 traced “追踪”、untraced “未追踪” 引用。未追踪引用也叫 指针 。 追踪引用指向垃圾回收堆中的对象,未追踪引用指向手动分配对象或内存中其它位置的对象。 因此,未追踪引用是 不安全 的。然而对于某些访问硬件的低级操作,未追踪引用是不可避免的。
使用 ref 关键字声明追踪引用,使用 ptr 关键字声明未追踪引用。通常, ptr T 可以隐式转换为 pointer 类型。
空的下标 [] 表示法可以用来取代引用, addr 过程返回一个对象的地址。地址始终是未追踪的引用。因此, addr 的使用是 不安全的 功能。
. (访问元组和对象字段运算符)和 [] (数组/字符串/序列索引运算符)运算符对引用类型执行隐式解引用操作:
type
Node = ref NodeObj
NodeObj = object
le, ri: Node
data: int
var
n: Node
new(n)
n.data = 9
# 不必写 n[].data; 非常不推荐 n[].data!
为了简化结构类型检查,递归元组无效:
# 无效递归
type MyTuple = tuple[a: ref MyTuple]
同样, T = ref T 是无效类型。
作为语法扩展,如果在类型部分中通过 ref object 或 ptr object 符号声明,则 object 类型可以是匿名的。当一个对象只能获得引用语义时,这个特性很有用:
type
Node = ref object
le, ri: Node
data: int
要分配一个新的追踪对象,必须使用内置的过程 new 。可以使用过程 alloc , dealloc 和 realloc 来处理未追踪的内存。 更多信息,查看系统模块文档。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .