Почему эта функция возвращает (собственное) значение?
Код из: 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.
Я также рекомендовал бы статью "Обработка ссылок".