(Vala)带有字符串模板的无主字符串返回类型

时间:2016-10-22 13:39:35

标签: vala

unowned string to_string () {
    int x = 0;
    return @"$x";
    // error: Return value transfers ownership but method return type
    // hasn't been declared to transfer ownership
}

不起作用。并且没有unowned

为什么呢?我看到了:

  

Vala中的文字字符串始终由程序模块本身拥有    - 在https://chebizarro.gitbooks.io/the-vala-tutorial/content/properties_ownership.html

与普通字符串文字相比,程序模块的字符串模板不是owned?或者我误解了什么?

3 个答案:

答案 0 :(得分:2)

自动调用字符串模板"当你使用它时。

因此,虽然实际模板文字可能由程序模块拥有,但结果字符串将是正常拥有的字符串(在临时变量中)。

因此字符串模板的结果不归程序模块所有,而是由它所驻留的方法拥有。因此编译器消息是正确的。

答案 1 :(得分:2)

字符串模板不是文字字符串。

可以在编译时计算文字,因此编译器只需在编译的程序中包含字符串的副本。字符串模板OTOH通常在编译时无法知道(想象一下,如果您将x作为参数传递,或者从实例或全局变量中获取它,那么就会在堆上分配内存和内容字符串的字符串是在运行时计算的。

换句话说,字符串模板基本上是用于调用string.printf的语法糖(或者,从C&#39的角度来看,g_strdup_printf)。

答案 2 :(得分:2)

字符串模板是连接字符串和变量的简写。所以你的程序可以被认为是等同于:

void main () {
    string a = example ();
}

unowned string example () {
    int x = 0;
    return "" + x.to_string ();
}

字符串模板为您调用to_string ()方法。上面的例子产生了同样的错误。也许错误消息不太有用,但您需要考虑为什么要返回无主字符串。

使字符串无主,关闭Vala对字符串的内存管理。如果返回一个常量,这可能是相关的,但在您的示例中,字符串是在运行时创建的,因此在堆上分配。这意味着您想要使用Vala的内存管理。通常,您应该让Vala使用其默认设置进行内存管理。