rust - 为什么这个“通用”的 Rust 代码不能按预期工作?
问题描述
我最近开始学习 Rust,并且正在尝试编写一个小型表达式评估器。我已经练习 Rust 几天了,并认为这个任务与 Rust 的 Traits 一起工作会很酷。我试图做的是让 Sum & Number 结构实现 Expression 特征,这样我就可以将(双关语意外)(1 + 2)表示为一个表达式,其中左侧和右侧也是表达式。我偶然发现了一个问题,你不能只使用 Traits 作为属性的类型,所以你应该使用&dyn Trait或Box in the Book。按照这个概念重写了它,现在它可以编译了,但我无法访问 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;
但它失败并出现错误:
non-primitive cast: std::boxed::Box<(dyn Expression + 'static)>
as Number
note:as
表达式只能用于在原始类型之间进行转换。考虑使用From
trait。
对不起,任何语言错误或混乱的解释,英语不是我的第一语言。
我不是经验丰富的程序员,而且对 Rust 很陌生,所以我非常感谢任何帮助,谢谢!
解决方案
Rust 不允许你转换非原始类型。
参考: https ://doc.rust-lang.org/rust-by-example/types/cast.html
推荐阅读
- laravel - Docker未安装Supervisor并在运行时崩溃
- laravel - 如何在 Laravel 控制器中发送数组数据作为获取值的参数?
- c++ - 如何在子类和父类的标头中指定构造函数
- windows - 如何用加号替换变量中的空格。批
- ruby - (ArgumentError) Ruby:参数数量错误
- javascript - 让 JavaScript 等到元素在页面上呈现,然后将 JS 对象绑定到它
- postgresql - Postgres now() 大于自身
- sql-server - 使用 SSMS 导入工具访问数据库到 SQL,数据类型 130 错误
- python - 命令行中的节点脚本进行测试?
- install4j - 从启动器调用自动更新程序 - Install4J