如何在 nim 的堆上创建一个 IntSet?
how to create an IntSet on the heap in nim?
nim 中有各种库 return 实际对象,而不是引用。有时我想要一个堆上的对象(不管效率如何)——例如,当我有一个需要对对象的引用的通用过程时。
我发现在堆上构造 IntSet 的唯一方法是:
proc newIntSet() : ref IntSet =
new(result)
assign(result[], initIntSet())
这似乎行得通,但感觉像是破解。我担心它是否只是看起来有效。 ("assign"复制的结构是否正确清理?)有没有更好的方法?是否有更通用的方法可以与其他对象一起使用?
您的代码完全有效。生成的引用将像任何其他引用一样受到垃圾收集。
如果您发现自己经常这样做,可以定义以下 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
nim 中有各种库 return 实际对象,而不是引用。有时我想要一个堆上的对象(不管效率如何)——例如,当我有一个需要对对象的引用的通用过程时。
我发现在堆上构造 IntSet 的唯一方法是:
proc newIntSet() : ref IntSet =
new(result)
assign(result[], initIntSet())
这似乎行得通,但感觉像是破解。我担心它是否只是看起来有效。 ("assign"复制的结构是否正确清理?)有没有更好的方法?是否有更通用的方法可以与其他对象一起使用?
您的代码完全有效。生成的引用将像任何其他引用一样受到垃圾收集。
如果您发现自己经常这样做,可以定义以下 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