字符串追加,无法移动'&'指针的解引用。

4

我正在尝试将两个字符串组合起来,但由于我对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个回答

9
append函数的定义如下:
fn append(self, second: &str) -> String

普通的self表示按值传递的语义。按值传递将接收器移动到方法中,除非接收器实现了Copy(字符串没有)。因此,您必须克隆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();

4

看起来你可能混淆了 append 和 push_str,append 通过值获取接收者并返回自身,而 push_str 则仅仅改变接收者(通过可变引用传递),就像你期望的那样。所以你的例子最简单的修复方法是将 append 改为 push_str。你还需要将 "ref x" 改为 "ref mut x",这样它才能被改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接