gpt4 book ai didi

nim-lang - 如何在nim堆上创建IntSet?

转载 作者:行者123 更新时间:2023-12-02 22:15:34 24 4
gpt4 key购买 nike

nim 中有各种库返回实际对象,而不是引用。有时我想要堆上有一个对象(无论效率如何)——例如,当我有一个需要对对象进行引用的通用过程时。

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

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

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

最佳答案

您的代码完全有效。生成的引用将像任何其他引用一样接受垃圾回收。

如果您发现自己经常这样做,您可以定义以下 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-lang - 如何在nim堆上创建IntSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com