我如何处理/规避 Rust 中的“无法分配给 ... 后面的 & 引用”?

Isl*_*ion 7 reference mutable rust assign

我会实现一个简单的链表。这是我到目前为止的(工作)代码:

pub struct LinkedList<T> {
    start: Option<Box<Link<T>>>,
}

impl<T> LinkedList<T> {
    pub fn new() -> LinkedList<T> {
        return LinkedList { start: None };
    }
}

struct Link<T> {
    value: Box<T>,
    next: Option<Box<Link<T>>>,
}

impl<T> Link<T> {
    fn new_end(value: T) -> Link<T> {
        return Link::new(value, None);
    }

    fn new(value: T, next: Option<Box<Link<T>>>) -> Link<T> {
        return Link {
            value: Box::new(value),
            next,
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

列表中的下一个是附加到列表的方法;这就是我想出的:

pub fn append(&mut self, element: T) {
    // Create the link to append
    let new_link = Some(Box::new(Link::new_end(element)));

    // Find the last element of the list. None, if the list is empty
    let mut last = &self.start;
    while let Some(link) = last {
        last = &link.next;
    }

    // Insert the new link at the correct position
    match last {
        None => self.start = new_link,
        Some(last) => last.next = new_link, // This fails
    }
}
Run Code Online (Sandbox Code Playgroud)

精确的编译器错误是

pub struct LinkedList<T> {
    start: Option<Box<Link<T>>>,
}

impl<T> LinkedList<T> {
    pub fn new() -> LinkedList<T> {
        return LinkedList { start: None };
    }
}

struct Link<T> {
    value: Box<T>,
    next: Option<Box<Link<T>>>,
}

impl<T> Link<T> {
    fn new_end(value: T) -> Link<T> {
        return Link::new(value, None);
    }

    fn new(value: T, next: Option<Box<Link<T>>>) -> Link<T> {
        return Link {
            value: Box::new(value),
            next,
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

我隐约明白这个问题;你不能改变一个不可变的引用。但是使引用可变似乎确实会使错误变得更糟。

如何处理这些类型的错误?是否有一个简单的快速修复,或者您是否在 Rust 中构建了完全不同的代码?

edw*_*rdw 8

你的代码几乎工作。如果您可变地绑定,它将

impl<T> LinkedList<T> {
    pub fn append(&mut self, element: T) {
        // Create the link to append
        let new_link = Some(Box::new(Link::new_end(element)));

        // Find the last element of the list. None, if the list is empty
        let mut last = &mut self.start;
        while let Some(link) = last {
            last = &mut link.next;
        }

        // Insert the new link at the correct position
        match last {
            None => self.start = new_link,
            Some(ref mut last) => last.next = new_link,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

仅供参考,最近这个问题的答案很好地阐明了 Rust 中有关可变性、类型和绑定的问题。