我最近开始学习Rust,并且正在尝试编写一个小的表达式评估程序。我已经练习了Rust几天了,以为与Rust的Traits一起工作会很酷。我试图做的是使Sum&Number结构实现Expression特质,以便我可以将([pun(无意间))(1 + 2)表示为expression,其中左右两侧也是表达式。我偶然发现了一个问题,即您不能只使用特征作为属性的类型,因此应该在本书中使用&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)>
为Number
注意:as
表达式只能用于在原始类型之间进行转换。考虑使用From
特性。
抱歉任何语言错误或混乱的解释,英语不是我的母语。我不是一个经验丰富的程序员,并且对Rust还是很陌生,所以我非常感谢您的帮助,谢谢!
Rust不允许您转换非基本类型。
参考:https://doc.rust-lang.org/rust-by-example/types/cast.html
我认为您要尝试的是此(complete code in the playground):
trait Expression {
fn evaluate(&self) -> i32;
}
impl Expression for Number {
fn evaluate(&self) -> i32 {
self.val
}
}
impl Expression for Sum {
fn evaluate(&self) -> i32 {
self.left.evaluate() + self.right.evaluate()
}
}