首页 文章

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

提问于
浏览
3

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

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

proc newIntSet() : ref IntSet =
  new(result)
  assign(result[], initIntSet())

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

1 回答

  • 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
    

相关问题