Переключение с Box <T>на Rc <T>для списка похожих на Схему минусов не компилируется - PullRequest
0 голосов
/ 24 сентября 2018

Программа ниже компилируется и запускается, если Rc заменяется на Box.Почему он не компилируется при использовании подсчета ссылок?Это вопрос о разнице между Rc<T> и Box<T>.

use std::rc::Rc;

#[derive(Debug, Clone)]
pub enum ILst {
    Nil,
    Cons(i32, Rc<ILst>),
}

impl ILst {
    pub fn new() -> Self {
        ILst::Nil
    }

    pub fn cons(self, item: i32) -> Self {
        ILst::Cons(item, Rc::new(self)) 
    }

    pub fn car(&self) -> Option<i32> {
        match *self {
            ILst::Cons(u, ref _v) => Some(u),
            ILst::Nil => None,
        }
    }

    pub fn cdr(&self) -> Self {
        match *self {
            ILst::Cons(_u, ref v) => *v.clone(),
            ILst::Nil => ILst::Nil,
        }
    }
}

fn main() {
    let list = ILst::new().cons(17).cons(29);
    let rest = list.cdr();
    println!("list  = {:?}", rest);
}
error[E0507]: cannot move out of borrowed content
  --> src/main.rs:27:38
   |
27 |             ILst::Cons(_u, ref v) => *v.clone(),
   |                                      ^^^^^^^^^^ cannot move out of borrowed content

1 Ответ

0 голосов
/ 25 сентября 2018

Решение состоит в том, чтобы заменить

*v.clone()

на

Rc::deref(v).clone()

, а затем добавить строку

use::ops::Deref;

в начало программы.

...