有一个简单的例子:
struct MyStruct
a: int
b: int
def my_proc(): unowned list of MyStruct
var result = new list of MyStruct
var my_struct = MyStruct()
for var i = 1 to 10
my_struct.a = i
my_struct.b = i*i
result.add(my_struct)
return result
init
pass
在编译此代码的情况下,将出现错误:“尚未声明具有强引用的局部变量用作返回值和方法返回类型以转让所有权”。如何更改成功编译的代码?
最佳答案
Genie列表实际上是“伪装”中的Gee.List<T>
,它是一个类类型,因此将对其进行引用计数。
另外,类型推断的var
变量当前始终是一个自有变量(Vala错误跟踪器中有关于此的错误报告)。
因此,result
强烈引用了类实例。您不能将其作为无主引用返回。
我强烈建议您为MyStruct
使用类而不是结构。
否则,您将遇到内存管理问题(不对结构进行引用计数)。
然后,您不必担心复制和所有权:
class MyStruct
a: int
b: int
def my_proc(): list of MyStruct
var result = new list of MyStruct
for var i = 1 to 10
var my_struct = new MyStruct()
my_struct.a = i
my_struct.b = i*i
result.add(my_struct)
return result
init
pass
编辑:如果您希望列表包含多个值,则还必须在循环内分配my_struct!我已经更新了代码以反射(reflect)这一点。
关于compiler-errors - 转让所有权(Genie/Vala),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33387995/