代码
从: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
(拥有)有什么好处
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教程的相应部分.
我还推荐参考处理文章.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)