compiler-errors - 转让所有权(Genie/Vala)

标签 compiler-errors vala genie

有一个简单的例子:

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/

相关文章:

c# - 尝试添加索引器时如何解决 C# 编译器错误 CS0102?

c - 配置文件错误

operating-system - 是否可以在 vala 中编写系统级代码

linux - Vala - 如何使用 Soup 创建 HTTP 请求?

vala - 在 Genie 中使用 GLib.HashTable

gtk3 - UI xml 文件中的 Gtk HeaderBar ActionBar pack_start pack_end

compiler-errors - 在 VS 2017 中编译 MVC 项目时拒绝访问 roslyn 文件夹

variables - 为什么用变量名替换其值导致 “' xxx'应该被声明为“错误”?

cairo - 如何子类化 Clutter.Actor(涉及 Cairo/Clutter.Canvas)