Прикладом невеликого арифметичного виразу може бути 10 + 20, який обчислюється як 30. Ми можемо представити цей вираз у вигляді дерева:
Більшим і складнішим виразом буде (10 * 9) + ((3 - 4) * 5), що обчислюється як 85. Ми зобразимо його у вигляді набагато більшого дерева:
У коді ми будемо представляти дерево двома типами:
#![allow(unused)]fnmain() {
/// Операція для виконання над двома під-виразами.#[derive(Debug)]enumOperation {
Add,
Sub,
Mul,
Div,
}
/// Вираз у вигляді дерева.#[derive(Debug)]enumExpression {
/// Операція над двома підвиразами.
Op { op: Operation, left: Box<Expression>, right: Box<Expression> },
/// Літеральне значення
Value(i64),
}
}
Тип Box тут є розумним вказівником і буде детально розглянутий пізніше у курсі. Вираз може бути “упаковано” за допомогою Box::new, як показано у тестах. Щоб обчислити вираз, використайте оператор розіменування (*), щоб “розпакувати” його: eval(*boxed_expr).
Деякі вирази не можуть бути обчислені і повертають помилку. Стандартний тип Result<Value, String> - це перелік, який представляє або успішне значення (Ok(Value)), або помилку (Err(String)). Ми розглянемо цей тип більш детально пізніше.
Скопіюйте та вставте код у середовище Rust і почніть реалізацію eval. Кінцевий продукт повинен пройти тести. Може бути корисно використати todo!() і змусити тести проходити один за одним. Ви також можете тимчасово оминути тест за допомогою #[ignore]: