我想通过实现一些非常简单的数据结构和算法来深入了解Rust,我从链表开始。结果发现这并不是那么简单。以下是我的代码:
enum List<T>
{
Node(T, ~List<T>),
Nil
}
impl<T> List<T>
{
fn new(vector: &[T]) -> List<T> { Nil }
fn add(&mut self, item: T)
{
let tail = self;
loop
{
match *tail
{
Node(_, ~ref next) => tail = next,
Nil => break
}
}
*tail = Node(item, ~Nil);
}
}
由于不兼容的可变性,此代码无法编译,因为在匹配语句中无法将 next 分配给 tail。我知道可以使用垃圾收集指针轻松完成这个问题,但那样做有点违背了练习的教育目的:我想知道如何在没有 Gc 或 Rc 指针的情况下完成这个问题。