Я недавно начал изучать Rust и пытаюсь написать оценщик небольших выражений. Я практиковал Rust уже несколько дней и думал, что это круто, работать с чертами Rust. Я попытался сделать так, чтобы структуры Sum & Number реализовали черту Expression, чтобы я мог express (каламбур непреднамеренно) (1 + 2) как выражение , где слева и справа стороны тоже выражения. Я наткнулся на проблему, заключающуюся в том, что вы не можете просто использовать Черты в качестве типов свойств, поэтому вместо них вы должны использовать & dyn Trait или Box в Книге. Исходя из этого, я переписал его, и теперь он компилируется, но я не могу получить доступ к значениям внутри Sum. Вот мой код:
trait Expression {}
#[derive(Debug)]
struct Number {
pub val: i32
}
impl Expression for Number {}
struct Sum {
pub left: Box<dyn Expression>,
pub right: Box<dyn Expression>
}
impl Expression for Sum {}
fn main() {
let e = Sum{ left: Box::new(Number{ val: 2}),
right: Box::new(Number{ val: 2})
};
let sum = (2 + 2);
println!("{:#?}", sum);
}
Я хочу получить значение Number :
e.left.val
и использовать вложенные конструкции, такие как:
Sum{Sum{Number, Sum{Number, Number}}, Number}
Я также пытался сделать явное приведение к Number:
let val = (e.left as Number).val;
Но это не удается с ошибкой: не примитивное приведение: std::boxed::Box<(dyn Expression + 'static)>
as Number
примечание: выражение as
можно использовать только для преобразования между примитивными типами. Подумайте об использовании From
черты .
Извините за любые языковые ошибки или грязное объяснение, Engli sh не мой родной язык.
Я не опытный программист и очень плохо знаком с Руст, поэтому я был бы очень признателен за любую помощь, спасибо!