2016-10-22 128 views
1
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由程序模塊?或者我誤解了某些東西?

回答

2

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

文字可以在編譯時計算,所以編譯器只是在編譯的程序中包含一個字符串的副本。字符串模板OTOH在編譯時通常是不可知的(想象一下,如果你將x作爲參數傳遞,或者從實例或全局變量中獲取),所以內存分配在堆上,並且字符串的內容是在運行時計算。

換句話說,字符串模板基本上是對string.printf(或者從C的角度來看,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使用它的默認設置來進行內存管理。