Rust 链表不能借用上一个和下一个元素作为可变的(只需要不可变的引用)

Rust linked list cannot borrow previous and next elemt as mutable (just need immutable reference)

目前,我正在开发一个模拟(多链)摆的小应用程序。 为了拯救他们,我决定去 std::collections::LinkedList.

显示它们并静态移动它们不是问题,但为了计算实际运动,我需要知道父摆和子摆的一些值。

我真的不需要对它们的可变引用,但链表 API 不允许我使用不可变引用。但我想这无论如何都不会改变编译器的想法,因为它仍然是一个可变的和一些不可变的借用。

我的代码如下所示:

let mut cursor = /* some linked list with 0 or more elements */.cursor_front_mut();

// the first element gets a phantom parent, that has no effect on the calculation
let mut first = Pendulum::zero_center();
// same with the last element. But we don't know the position of this phantom yet.
let mut last;

while let Some(current) = cursor.current() { // << first mutable borrow occurs here
    { 
        // new scope, so I don't mutate the cursor while holding mutable references
        // to the surrounding elements
        // (I don't really need the next two borrows to be mutable)

        let parent = match cursor.peek_prev() { // << second mutable borrow occurs here
            Some(parent) => parent,
            None => &mut first
        };
        let child = match cursor.peek_next() { // third mutable borrow occurs here
            Some(child) => child,
            None => {
                last = Pendulum::zero(current.bottom_pos); // << bottom_pos is of type Copy
                &mut last
            }
        };

        // update the current pendulum
        // update does take a immutable reference of parent and child
        // since it only needs to read some values of them
        current.update(parent, child);
    }
    cursor.move_next();
}

如果我将此代码包装在不安全的 {} 中,编译器不会关心并一直告诉我我有多个可变借用 + 一个不必要的 unsafe 块。

如果有人能帮助我就太好了!
如果在这里使用 LinkedList 完全是垃圾并且有更好的方法,请告诉我!

非常感谢!

通常,可变引用需要独占访问它们指向的对象,不安全块对此没有影响。原始指针没有这个要求,所以编写违反这些要求的代码就必须使用原始指针。

使用不安全的 Rust 实现链表将超出 SO 答案的范围,但我建议 Learning Rust with too many Linked Lists 作为解决此问题的方法的资源。

有时使用向量中的索引构建链表是一种很好的替代方法,它可以解决 Rust 对其引用提出的许多要求的任何问题。