如何移动自有指针

时间:2013-07-08 20:36:09

标签: rust

作为参考,我正在使用Rust 0.7。

我正在尝试使用拥有的链表创建堆栈实现,但我遇到了麻烦。

trait Stack<T> {
    fn push(&mut self, item : T);
    fn pop(&mut self) -> Option<T>;
}

enum Chain<T> {
    Link(T, ~Chain<T>),
    Break
}

impl<T> Stack<T> for ~Chain<T> {
    fn push(&mut self, item : T) {
        *self = ~Link(item, *self);
    }
    fn pop(&mut self) -> Option<T> {
        None
    }
}

当我尝试rustc stack.rs时,我收到以下错误:

stack.rs:13:28: 13:34 error: cannot move out of dereference of & pointer
stack.rs:13         *self = ~Link(item, *self);
                                        ^~~~~~

我不知道如何克服这个问题,或者我可以做些什么来做到这一点。看起来我应该能够在不使用托管指针的情况下创建这个数据结构,但我还没有看到很多关于这类内容的文档。

1 个答案:

答案 0 :(得分:5)

自我分配(我认为包括构建一个新东西,如Link(item, *self) implies a move。这意味着在构建新{{1}的过程中自我变得无法使用,因为:

  

“移动一个值后,它不能再从源位置使用,也不会在那里被销毁。”

The Right Way™可能最好记录在this example in the stdlib中所做的事情。这是一个双重链接列表,它是管理的,但它是可变的,我希望免费复制。还有list of useful container types

然而,我确实设法使这个不可变版本的数据结构正常工作。

Link