如何移动自有指针

Kyl*_*ten 8 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

teh*_*ter 5

从自我中分配(我认为包括从中构造一个新东西,如同Link(item, *self) 意味着移动.这意味着在构建新的过程中Link,自我变得无法使用,因为:

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

Right way™可能最好通过stdlib此示例中的内容进行记录.这是一个双重链接列表,它是管理的,但它是可变的,我希望免费复制.还有一些有用的容器类型列表.

但是,我确实设法使这个不可变版本的数据结构工作.

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

#[deriving(Eq, ToStr)]
enum Chain<T> {
    Link(T, ~Chain<T>),
    Break
}

impl<T> Stack<T> for Chain<T> {
    fn push(self, item : T) -> Chain<T> {
        Link(item, ~self)
    }
    fn pop(self)            -> Option<(T, Chain<T>)> {
        match self {
            Link(item, ~new_self) => Some((item, new_self)),
            Break                 => None
        }
    }
    fn new()                -> Chain<T> {
        Break
    }
}

fn main() {
    let b : ~Chain<int> = ~Stack::new();
    println(b.push(1).push(2).push(3).to_str());
}
Run Code Online (Sandbox Code Playgroud)

  • 在这个阶段,你不妨让选项包含两个结果 - 它们总是要么是一部分,要么都不是. (3认同)