代码 来自:Genie howto repeat a string N times as an string array Genie 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
var a 是一个局部变量,当 a 超出范围时,它将被销毁。 为什么这个功能
返回(拥有)a.str
之间有什么区别
返回a.str
return(拥有)a.str
(拥有)
的好处是什么?答案 0 :(得分:5)
return a.str
将使用g_strdup
复制字符串,因为默认情况下,函数结果和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:ownership section of the Vala tutorial和corresponding part of the Genie tutorial中记录了这一点。