Исходя из языка сценариев с некоторыми C, пытаясь «научиться», Rust приводит меня к вопросу о моей компетенции. Я пытаюсь понять, как изменить принадлежащий ему указатель, и изо всех сил пытаюсь это сделать.Рудиментарное дерево и указатели в ржавчине
Помимо копирования из дополнительных библиотек, я не могу найти нужную рекурсию на двоичном дереве. В частности, я не знаю, как заменить ветви указателя. Если со связанным списком я могу обмануть и использовать временный вектор, чтобы вернуть новый список, или добавить в заголовок новый Cons (значение, ~ Cons), ветви меня поразили.
enum NaiveTreeNode {
NNil,
NNode(~NaiveTreeNode, ~NaiveTreeNode, int, char)
// left right key val
}
impl NaiveTreeNode {
fn eq(first_node: &NaiveTreeNode, second_node: &NaiveTreeNode) -> bool {
match (first_node, second_node) {
(&NNil, &NNil) => true,
(&NNode(~ref left_lval, ~ref left_rval, left_leafkey, left_leafval),
&NNode(~ref right_lval, ~ref right_rval, right_leafkey, right_leafval)
) if left_leafkey == right_leafkey && left_leafval == right_leafval => {
NaiveTreeNode::eq(left_lval, right_lval) && NaiveTreeNode::eq(left_rval, right_rval)
},
_ => false
}
}
fn add_branch(&mut self, node_to_add: ~NaiveTreeNode) {
match (self, node_to_add) {
(&NaiveTreeNode(~NNil, ~ref r_branch, leaf_key, leaf_val), ~NaiveTreeNode(_, _, new_node_key, _) )
if leaf_key > new_node_key => self = &NaiveTreeNode(node_to_add, *r_branch, leaf_key, leaf_val),
(&NaiveTreeNode(~ref l_branch, ~NNil, leaf_key, leaf_val), ~NaiveTreeNode(_, _, new_node_key, _))
if leaf_key < new_node_key => self = &NaiveTreeNode(*l_branch, node_to_add, leaf_key, leaf_val),
(&NaiveTreeNode(~ref l_branch, _, leaf_key, _), ~NaiveTreeNode(_, _, new_node_key, _))
if leaf_key > new_node_key => self.add_branch(l_branch, node_to_add),
(&NaiveTreeNode(_, ~ref r_branch, leaf_key, _), ~NaiveTreeNode(_, _, new_node_key, _))
if leaf_key < new_node_key => self.add_branch(l_branch, node_to_add),
(_, ~NNil) => fail!("NNil branch. failing"),
(&NNil, _) => fail!("NNil trunk. failing"),
_ => fail!("something is wrong. failing.")
};
}
}
Компилятор выбрасывает 11 ошибок на этом, и когда я печатаю его, он чувствует, как псевдокод. Я расстроен, потому что я чувствую себя хорошо, реализуя дерево с помощью C-указателей.
То, что я пытаюсь сделать, это обновить указатели на месте - это часть причины, по которой я их использую, правильно? Вместо того, чтобы копировать все дерево каждый раз, когда я хочу внести изменения , Но я даже не знаю, как добраться до них.
Я не уверен, как бы я сделал это с помощью структур, а не перечислений. Я просмотрел библиотеку Treemap, но, похоже, она слишком сложна для того, что я хочу сделать прямо сейчас, что является доказательством концепции - я, возможно, пытаюсь запустить, когда мне нужно проползти!
Много синтаксиса ржавчины, используемого здесь, изменилось с момента его публикации. –