Почему эта функция возвращает (собственное) значение?

Код из: Genie, как повторить строку N раз в виде массива строк Genie, как повторить строку N раз в виде массива строк

def repeatwithsep (e: string, n: int, separator: string): string
    var elen = e.length;
    var slen = separator.length;
    var a = new StringBuilder.sized ((elen * n) + (slen * (n - 1)) + 1);
    for var i = 0 to (n - 1)
        if i != 0
            a.append_len (separator, slen)
        a.append_len (e, elen)
    return (owned) a.str

var a является локальной переменной, когда a выходит из области видимости, она будет уничтожена. почему эта функция

возврат (в собственность) a.str

в чем разница между

вернуть a.str

возврат (в собственность) a.str

какая выгода (принадлежит)

1 ответ

Решение

return a.str создаст копию строки, используя g_strdupпотому что по умолчанию результат функции и StringBuilder будут владеть отдельной копией строки после (неявного) присваивания.

Поскольку StringBuilder хранится в a будет выходить за рамки, и его копия никогда не будет использоваться снова, в этом случае это нежелательно / эффективно.

Следовательно, решение состоит в том, чтобы передать право собственности на строку от a.str к результату функции, используя (owned) директивы.

Кстати: вы можете легко это выяснить, скомпилировав обе версии с valac -C и сравнение сгенерированного кода C:

-       _tmp21_->str = NULL;
-       result = _tmp22_;
+       _tmp23_ = g_strdup (_tmp22_);
+       result = _tmp23_;

(В этом сравнении левая сторона была return (owned) a.str и правая сторона была return a.str)

PS: Это задокументировано в разделе о правах собственности в учебнике Vala, а также в соответствующей части учебника Genie.

Я также рекомендовал бы статью "Обработка ссылок".

Другие вопросы по тегам