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
?或者我误解了什么?
答案 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使用其默认设置进行内存管理。