编者注:此代码示例来自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,但我不明白它是如何适用于我的代码的。
答案 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
。