无法移出& mut指针

时间:2014-08-30 23:36:45

标签: rust

我已经将一个简单的链表实现为结构

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文档吗?

1 个答案:

答案 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 */ }