2015-07-13 7 views
3

код от: Genie howto repeat a string N times as an string arrayGenie howto repeat a string N times as an string arrayПочему эта функция возвращает (принадлежащее) значение?

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 

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

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

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

возвращение a.str

возвращение (принадлежит) a.str

, что является преимуществом (принадлежащим)

ответ

5

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

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

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

BTW: Вы можете легко найти это путем составления обеих версий с valac -C и сравнивая сгенерированный код C:

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

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

PS: Это задокументировано в ownership section of the Vala tutorial, а также corresponding part of the Genie tutorial.

Я также рекомендовал бы Reference Handling article.

+0

Как толчок, который написал этот фрагмент, не объяснив его, я могу подтвердить, что это причина '(принадлежащего)';) – nemequ

+0

, если ** (принадлежит) **? Исходные данные полностью исчезнут. в зависимости от меня понимание, ** не имеет права **. –

+0

@NaamFamas Я не понимаю, что вы комментируете, не могли бы вы перефразировать его? –