Что не так с заимствованием себя в классической реализации односвязного списка

Я новичок в огромном мире Rust. Я изучаю его уже неделю, и у меня появилась какая-то концепция, однако что-то не так с моей классической реализацией односвязного списка, и это связано с заимствованием и моим непониманием жизней. Вот код:

use std::fmt::Display;

#[derive(Debug)]
struct Node<T> {
    payload: T,
    next: Option<Box<Node<T>>>
}

impl<T> Node<T>
    where T: Display + PartialEq {
    fn new(payload: T, next: Option<Box<Node<T>>>) -> Option<Box<Node<T>>> {
        Some(Box::new(Node {
            payload,
            next
        }))
    }

    fn print_nodes(&mut self) {
        let this = self;
        loop {
            match this.next {
                Some(_) => {
                    print!("{} -> ", &this.payload);
                }
                None => {
                    print!("{}", &this.payload);
                    break;
                }
            }
            this = &mut this.next.unwrap();
        }
    }
}

fn main() {
    let a = Node::new(String::from("hello"), None);
    let b = Node::new(String::from("hey"), a);
    let mut d = b.unwrap();
    d.print_nodes();
}

Вот ошибка, которую я получаю:

error[E0597]: borrowed value does not live long enough
  --> main.rs:31:43
   |
31 |             this = &mut this.next.unwrap();
   |                         ------------------^ temporary value dropped here while still borrowed
   |                         |
   |                         temporary value created here
32 |         }
33 |     }
   |     - temporary value needs to live until here
   |
   = note: consider using a `let` binding to increase its lifetime

error[E0507]: cannot move out of borrowed content
  --> main.rs:31:25
   |
31 |             this = &mut this.next.unwrap();
   |                         ^^^^ cannot move out of borrowed content

error[E0384]: cannot assign twice to immutable variable `this`
  --> main.rs:31:13
   |
20 |         let this = self;
   |             ---- first assignment to `this`
...
31 |             this = &mut this.next.unwrap();
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot assign twice to immutable variable

Я был бы признателен, если бы кто-нибудь мог объяснить мою ошибку и порекомендовать что-то, чтобы это исправить.


person Emulebest    schedule 18.01.2018    source источник
comment
Примечание: вы действительно имели в виду жизненные циклы или вы имели в виду время жизни?   -  person Matthieu M.    schedule 18.01.2018
comment
Вам не нужно заимствовать изменчиво для печати; действительно ли печать — это все, что вам нужно сделать, или это заполнитель для функции, в которой вы хотели бы что-то видоизменить?   -  person Matthieu M.    schedule 18.01.2018
comment
Интересно, почему все хотят написать связанный список в Rust. ИМХО, это не лучший момент для начала.   -  person Boiethios    schedule 18.01.2018
comment
Я хочу реализовать свою собственную печать, которая могла бы оставить мне контекст переменной 'd'   -  person Emulebest    schedule 18.01.2018
comment
Обязательная ссылка: Изучение Rust на слишком большом количестве связанных списков.   -  person Joe Clay    schedule 18.01.2018
comment
Заимствование изменчиво для печати предназначено только для целей обучения   -  person Emulebest    schedule 18.01.2018
comment
Следуйте первому дубликату, затем второму, и вы получите подобный код< /а>.   -  person Shepmaster    schedule 18.01.2018
comment
@Boy Почему бы и нет? Звучит как хороший способ изучить, как работают продолжительность жизни и заимствование, на игрушечном примере.   -  person CodesInChaos    schedule 18.01.2018