(Vala) тип возврата неизвестной строки со строковыми шаблонами

#vala

#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 используются программным модулем? или я что-то неправильно понял?

Ответ №1:

Строковые шаблоны не являются буквальными строками.

Литералы могут быть вычислены во время компиляции, поэтому компилятор просто включает копию строки в скомпилированную программу. Строковые шаблоны, OTOH, обычно не могут быть известны во время компиляции (представьте, что вы передаете x в качестве параметра или получаете его из экземпляра или глобальной переменной), поэтому память выделяется в куче, а содержимое строки вычисляется во время выполнения.

Другими словами, строковые шаблоны — это в основном синтаксический сахар для вызова string.printf (или, с точки зрения C, g_strdup_printf ).

Ответ №2:

Строковый шаблон автоматически «вызывается» при его использовании.

Таким образом, хотя фактический литерал шаблона может принадлежать программному модулю, результирующая строка будет обычной принадлежащей строкой (во временной переменной).

Таким образом, результат строкового шаблона принадлежит не программному модулю, а методу, в котором он находится. Таким образом, сообщение компилятора является правильным.

Ответ №3:

Строковые шаблоны — это краткое руководство по объединению строк и переменных. Таким образом, вашу программу можно рассматривать как эквивалент:

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

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

Строковый шаблон вызывает to_string () метод для вас. Приведенный выше пример выдает ту же ошибку. Возможно, сообщение об ошибке не слишком полезно, но вам нужно подумать, почему вы возвращаете unowned string.

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