代码
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超出作用域时,它将被销毁。为什么使用这个函数
return (owned) .str
返回a.str返回(owned) .str
return a.str
将使用g_strdup
复制字符串,因为默认情况下,函数result和StringBuilder在(隐式)赋值后都拥有字符串的单独副本。
由于存储在a
中的StringBuilder将超出作用域,因此它的副本将永远不会再次使用,因此在这种情况下,这是不可取的/有效的。
因此,解决方案是将字符串的所有权从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:这在Vala教程的所有权部分和Genie教程的相应部分中都有记录。
我还要推荐参考处理文章