作为参考,我正在使用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)
我不知道如何克服这个问题,或者我能做些什么来做到这一点.看起来我应该能够在不使用托管指针的情况下创建这个数据结构,但我还没有看到很多关于这类内容的文档.
从自我中分配(我认为包括从中构造一个新东西,如同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)