Как создать рекурсивную структуру данных с помощью Rust и управлять ею? - PullRequest
0 голосов
/ 09 мая 2020

Прочитав https://doc.rust-lang.org/book/ (версия 2018 года) от начала до конца, я начал один из нескольких небольших обучающих проектов, чтобы попрактиковаться.

Идея заключалась в том, чтобы воссоздать генератор идентификаторов. писал уже в Java. Основой этого является рекурсивная структура с узлами, каждый из которых содержит список символов, индекс, указывающий на текущий символ в списке и дочерний элемент (если установлен). Таким образом, я хочу создать любую доступную комбинацию символов (учитывая списки символов и c.).

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

При поиске в StackOverflow я нашел несколько примеров, но, насколько я понимаю, ни один из них не соответствует моим недостаточным знаниям . Наконец я попытался взять рабочий пример https://stevedonovan.github.io/rust-gentle-intro/2-structs-enums-lifetimes.html#structs -with-Dynami c -data и адаптировать его к своим потребностям, но снова не смог вставить узел в узел.

Ниже приводится моя исходная база кода:

main.rs

use idgen::FigureElement;

fn main() {

    let array = ['a', 'b', 'c'];

    //~ let fe = FigureElement {figure: Figure::Absence, index: 23};
    let mut fe2 = FigureElement::new(&array);
    let mut fe3 = FigureElement::new(&array);

    fe2.add_figure(fe3);

}

lib.rs


pub enum Figure<'a> {
    Position(Box<&'a mut FigureElement<'a>>),
    Absence,
}

pub struct FigureElement<'a> {

    figure: Figure<'a>,

    //~ values: Vec<char>,
    array: &'a [char],

    index: usize,

}

impl<'a> FigureElement<'a> {

    pub fn new(a: &'a [char]) -> FigureElement<'a> {

        FigureElement {
            figure: Figure::Absence,
            array: a,
            index: 0
        }

    }

    pub fn get_index(&self) -> usize {
        self.index
    }

    pub fn add_figure(&mut self, f: &'a mut FigureElement<'a>){

        println!("in add_figure");

        match &self.figure {

            Figure::Position(b) => {
                println!("in add_figure : position");
                    //~ let fe = b;
                    //~ fe.add_figure(f);
                    //~ *b.add_figure(f);
                    //~ let Figure::Position(fe) = &self.figure;
                    //~ fe.add_figure(f);
                    //~ b = &self.figure(fer);
                    //~ b.add_figure(f);
                    //~ fer.add_figure(f);
                    let fe = &*b;
                    fe.add_figure(f);
                },

            Figure::Absence => {

                println!("in add_figure : absence");
                self.figure = Figure::Position(Box::new(f));
                },

        }

    }

    pub fn get_value(&self) -> String {


        let s = match &self.figure {

            Figure::Position(..) => {
                let mut s = self.array[self.index].to_string();
                s.push_str(&self.get_value());
                s
                },

            Figure::Absence => self.array[self.index].to_string(),

        };

        s
    }

}

Время жизни вставляется в соответствии с сообщениями об ошибках компилятора. Древовидная структура не предназначена. А версия компилятора (?) - 1.41.0.

...