2016-10-22 8 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) невозобновляемый тип возвращаемого типа с строковыми шаблонами

Почему? Я видел:

Символьные строки в 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() для вас. Вышеприведенный пример дает ту же ошибку. Возможно, сообщение об ошибке не слишком полезно, но вам нужно подумать о том, почему вы возвращаете неизмененную строку.

Выполнение строки unowned отключает управление памятью Vala для строки. Это может иметь значение, если константа возвращается, но в вашем примере строка создается во время выполнения и поэтому выделяется в куче. Это означает, что вы хотите использовать управление памятью Vala. Как правило, вы должны позволить Vala использовать свои настройки по умолчанию для управления памятью.