Прочитав 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.