8

作为参考,我使用的是 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);
                                        ^~~~~~

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

4

1 回答 1

5

来自 self 的任一项分配(我认为包括从中构造一个新事物,如在Link(item, *self) 暗示 move的情况下。这意味着在构造新事物的过程中Linkself 变得不可用,因为:

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

The 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());
}
于 2013-07-09T05:42:39.133 回答