为什么在匹配结果中使用引用"不能移出引用"?

时间:2014-06-23 11:34:58

标签: rust

  

编者注:此代码示例来自1.0之前的Rust版本,并且不是有效的Rust 1.0代码。此代码的更新版本会产生不同的错误,但答案仍包含有价值的信息。

我不明白为什么以下代码无效。

use std::string::String;
use std::str;

fn append_byte_to_string(string: &String, bytes: &[u8]) {
     let msg = str::from_utf8(bytes);
     match msg {
        Some(msg_str) => {
            string.append("plop");//msg_str);
        },  
        None => {}
    }   
}

fn main() {
    append_byte_to_string(&String::new(), [64,65]);
}

我收到了以下错误:

test.rs:8:4: 8:10 error: cannot move out of dereference of `&`-pointer
test.rs:8                       string.append("plop");//msg_str);
                                ^~~~~~
error: aborting due to previous error

我已经看过explanations,但我不明白它是如何适用于我的代码的。

1 个答案:

答案 0 :(得分:4)

您有一个&String不可变的String对象的引用。您的方法需要使用&mut String才能改变字符串:

use std::str;

fn append_byte_to_string(string: &mut String, bytes: &[u8]) {
    if let Ok(msg) = str::from_utf8(bytes) {
        string.push_str(msg);
    }
}

fn main() {
    append_byte_to_string(&mut String::new(), &[64, 65]);
}

顺便说一句,你需要push_str而不是append,因为append(或者在Rust 1.0中,Add::add)使用它的参数并返回它,而{{{ 1}}需要push_str