如何在 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