nim中有各种库可以返回实际对象,而不是引用。有时候我想要一个堆上的对象(无论效率如何) - 例如当我有一个泛型过程需要引用一个对象时。
在我发现的堆上构造IntSet的唯一方法是:
proc newIntSet() : ref IntSet =
new(result)
assign(result[], initIntSet())
这似乎有效,但感觉就像一个黑客。我担心它似乎只是起作用。 (结构是否被&#34复制;分配"正确清理?)有更好的方法吗?是否有更通用的方法可以与其他对象一起使用?
答案 0 :(得分:5)
您的代码完全有效。由此产生的引用将作为任何其他参考进行垃圾收集。
如果您经常这样做,可以定义以下makeRef
模板以消除代码重复:
template makeRef(initExp: typed): expr =
var heapValue = new(type(initExp))
heapValue[] = initExp
heapValue
以下是一个示例用法:
import typetraits
type Foo = object
str: string
proc createFoo(s: string): Foo =
result.str = s
let x = makeRef createFoo("bar")
let y = makeRef Foo(str: "baz")
echo "x: ", x.type.name, " with x.str = ", x.str
将输出:
x: ref Foo with x.str = bar