首页 > 解决方案 > 如何在没有无用分配的情况下实现 Cons 列表前置?

问题描述

我正在阅读Testcase: linked-list in Rust by Example。RBE通过值prepend传递实现了方法self

fn prepend(self, elem: u32) -> List {
    // `Cons` also has type List
    Cons(elem, Box::new(self))
}

并将其称为:

list = list.prepend(1);
list = list.prepend(2);
list = list.prepend(3);

我想一遍又一遍地使用&mut self而不是分配,如下所示:list

list.prepend("asd");
list.prepend("def");
list.prepend("jkl");

我试过了:

enum LinkedList<T> {
    Cons(T, Box<LinkedList<T>>),
    Nil
}

impl<T> LinkedList<T> where T: Copy {
    fn prepend(&mut self, value: T) {
        let tail = mem::replace(self, Nil);
        *self = Cons(value, Box::new(tail));
    }
}

这行得通,但我正在做一个无用的Nilto分配self。有没有更好的方法来做到这一点,也许使用mem::replace或其他?

标签: rustcons

解决方案


推荐阅读