如何在nim中创建堆上的IntSet?

sha*_*unc 3 nim-lang

nim中有各种库,它们返回实际的对象,而不是引用.有时我想在堆上有一个对象(无论效率如何) - 例如,当我有一个泛型过程需要ref对象时.

在我发现的堆上构造IntSet的唯一方法是:

proc newIntSet() : ref IntSet =
  new(result)
  assign(result[], initIntSet())
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但感觉就像一个黑客.我担心它似乎只是起作用.(通过"分配"复制的结构是否已正确清理?)有更好的方法吗?是否有更通用的方法可以与其他对象一起使用?

zah*_*zah 5

您的代码完全有效.生成的引用将作为任何其他引用进行垃圾收集.

如果您经常发现这种情况,可以定义以下makeRef模板以消除代码重复:

template makeRef(initExp: typed): expr =
  var heapValue = new(type(initExp))
  heapValue[] = initExp
  heapValue
Run Code Online (Sandbox Code Playgroud)

以下是一个示例用法:

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
Run Code Online (Sandbox Code Playgroud)

哪个会输出:

x: ref Foo with x.str = bar
Run Code Online (Sandbox Code Playgroud)