Cannot move out of borrowed content when matching an enum

前端 未结 3 908
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-20 21:53

I\'m trying to print out a tree (it\'s a LinkedList right now, but that will be fixed):

use std::io;
use std::rc::Rc;

enum NodeKind {
    Branc         


        
3条回答
  •  抹茶落季
    2020-12-20 22:33

    The error is displayed because by default match will perform a move.

    After a value is moved (i.e. wasn't taken by reference or method that takes self was called) subsequent calls fail. You'll probably need to clone, which is a property both of your struct and enum lack. Once you add those (#[derive(Clone)) and change current = *next; into current = (*next).clone();, your program will work again!

    use std::io;
    use std::rc::Rc;
    
    #[derive(Clone)]
    enum NodeKind {
        Branch(Rc),
        Leaf,
    }
    
    #[derive(Clone)]
    struct Node {
        value: i32,
        kind: NodeKind,
    }
    
    fn main() {
        let leaf = Node { value: 10, kind: NodeKind::Leaf };
        let branch = Node { value: 50, kind: NodeKind::Branch(std::rc::Rc::new(leaf)) };
        let root = Node { value: 100, kind: NodeKind::Branch(std::rc::Rc::new(branch)) };
    
        let mut current = root;
        while true {
            println!("{}", current.value);
            match current.kind {
                NodeKind::Branch(next) => {
                    current = (*next).clone();
                }
                NodeKind::Leaf => {
                    break;
                }
            }
        }
    
        let reader = io::stdin();
        let buff = &mut String::new();
        let read = reader.read_line(buff);
    }
    

    Playground

    If you let mut current = &root then you can avoid clone() as per Vladimir's response below (playpen of Vladimir's version).

提交回复
热议问题