2015-02-15 2 views
0

Я пытаюсь определить рекурсивную структуру данных в Rust, но в моем понимании Rust и памяти есть некоторые недостатки - единственное, что мне удается сделать, это выбрать бой с помощью средства проверки заимствований.Как вернуть ссылку на часть рекурсивной структуры данных?

У меня есть следующий заглушка квадратного дерева и хочу проецировать один из квадрантов следующим образом.

use CC::{Node, Leaf}; 

enum CC { 
    Node(i32, bool, i32, Rc<CC>, Rc<CC>, Rc<CC>, Rc<CC>), 
    Leaf(bool), 
} 

impl CC { 
    fn nw(&self) -> CC { 
     match *self { 
      Node(_, _, _, ref nw, _, _, _) => *nw.clone(), 
      _ => panic!() 
     } 
    } 
} 

Но все, что я в конечном итоге является

src/hashlife.rs:34:47: 34:58 error: cannot move out of borrowed content 
src/hashlife.rs:34    Node(_, _, _, ref nw, _, _, _) => *nw.clone(), 
                   ^~~~~~~~~~~ 
+0

Вы хотите вернуть 'CC', отличный от того, который находится в вашем дереве, или ссылку на тот же самый? Ваш тип возврата 'nw' указывает, что он будет первым. – Shepmaster

+0

Я хочу вернуть ссылку на тот же узел, что и в дереве. – capitrane

ответ

3

У вас есть два варианта здесь.

Во-первых, вы можете вернуть ссылку на поддерева:

fn nw(&self) -> &CC { 
    match *self { 
     Node(_, _, _, ref nw, _, _, _) => &**nw, 
     _ => panic!() 
    } 
} 

Во-вторых, вы можете вернуть ссылочный подсчетом указатель:

fn nw(&self) -> Rc<CC> { 
    match *self { 
     Node(_, _, _, ref nw, _, _, _) => nw.clone() 
     _ => panic!() 
    } 
} 

Вы не можете вернуть только CC, однако, если вы не хотите клонировать само значение. Причина в том, что это означало бы перемещение из Rc, оставив его в некотором неопределенном состоянии, что по праву запрещено.

+0

Я думаю, что для первого случая вы можете просто сказать «Node (_, _, _, ref nw, _, _, _) => nw', из-за более гибких принуждений. – Shepmaster

+0

Спасибо! Конечно, имеет смысл вернуть Rc вместо CC. – capitrane

Смежные вопросы