我已经将一个简单的链表实现为结构
struct List {
data : String,
cons : Option<Box<List>>
}
我有另一个结构,它有一个这种类型的成员,定义如下
pub struct Context {
head : Option<Box<List>>
}
在这个结构的一个函数中,运行,我有这个代码
let mut temp_head = &mut self.head;
let mut full_msg = "".to_string();
while temp_head.is_some() {
let temp_node = temp_head.unwrap();
full_msg.push_str(temp_node.data.as_slice());
temp_head = temp_node.cons;
}
迭代链表并汇总其数据字符串。但是,设置temp_node值的行会产生以下错误:cannot move out of dereference of &mut-pointer
,并且编译器还会抱怨我尝试在最后输入temp_head的值不会超过块。
我已尝试在第一行克隆temp_head或在最后一行克隆temp_node.cons以获得具有我想要的生命周期的版本,但这只会产生其他错误,真正的问题似乎是我只是不明白为什么第一个版本不起作用。有人可以解释我做错了什么,和/或将我链接到解释这个的Rust文档吗?
答案 0 :(得分:4)
您需要非常小心代码中的引用,问题是首先您确实尝试在使用temp_head
时将unwrap()
的内容移出其容器。移动的内容将在while
块结尾处销毁,temp_head
引用已删除的内容。
您需要一直使用引用,对于此模式匹配比使用unwrap()
和is_some()
更合适,如下所示:
let mut temp_head = &self.head;
let mut full_msg = "".to_string();
while match temp_head {
&Some(ref temp_node) => { // get a reference to the content of node
full_msg.push_str(temp_node.data.as_slice()); // copy string content
temp_head = &temp_node.cons; // update reference
true // continue looping
},
&None => false // we reached the end, stop looping
} { /* body of while, nothing to do */ }