字符串追加,不能移出'&'指针的解除引用

时间:2014-07-24 20:49:50

标签: rust

我在组合两根琴弦时遇到了麻烦,我很难生锈,所以如果有更简单的方法可以这样做,请随时给我看。

我的函数循环遍历字符串元组(String,String)的向量,我想要做的是能够将这两个字符串元素组合成一个字符串。这就是我所拥有的:

for tup in bmp.bitmap_picture.mut_iter() {
    let &(ref x, ref y) = tup;
    let res_string = x;
    res_string.append(y.as_slice());
}

但我收到错误:error: cannot move out of dereference of '&'-pointer代码:res_string.append(y.as_slice());

我也尝试了res_string.append(y.clone().as_slice());,但发生了完全相同的错误,所以我不确定这是否正确。

2 个答案:

答案 0 :(得分:9)

追加的功能定义是:

fn append(self, second: &str) -> String

plain self表示按值语义。除非接收器实现Copy(String不支持),否则按值将接收器移动到方法中。所以你必须克隆x而不是y。

如果您想要移出向量,则必须使用move_iter

还有其他一些改进:

let string_pairs = vec![("Foo".to_string(),"Bar".to_string())];

// Option 1: leave original vector intact
let mut strings = Vec::new();
for &(ref x, ref y) in string_pairs.iter() {
    let string = x.clone().append(y.as_slice());
    strings.push(string);
}

// Option 2: consume original vector
let strings: Vec<String> = string_pairs.move_iter()
    .map(|(x, y)| x.append(y.as_slice()))
    .collect();

答案 1 :(得分:4)

似乎你可能会混淆append,它通过值接收接收器并使用push_str返回自身,push_str只是突变接收器(通过可变引用传递),如你所料。因此,对您的示例最简单的修复是更改追加到push_str。您还需要将“ref x”更改为“ref mut x”,以便可以进行变异。