首页 > 解决方案 > 为什么这个“通用”的 Rust 代码不能按预期工作?

问题描述

我最近开始学习 Rust,并且正在尝试编写一个小型表达式评估器。我已经练习 Rust 几天了,并认为这个任务与 Rust 的 Traits 一起工作会很酷。我试图做的是让 Sum & Number 结构实现 Expression 特征,这样我就可以将(双关语意外)(1 + 2)表示为一个表达式,其中左侧和右侧也是表达式。我偶然发现了一个问题,你不能只使用 Traits 作为属性的类型,所以你应该使用&dyn TraitBox 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表达式只能用于在原始类型之间进行转换。考虑使用Fromtrait

对不起,任何语言错误或混乱的解释,英语不是我的第一语言。
我不是经验丰富的程序员,而且对 Rust 很陌生,所以我非常感谢任何帮助,谢谢!

标签: rusttraits

解决方案


Rust 不允许你转换非原始类型。

参考: https ://doc.rust-lang.org/rust-by-example/types/cast.html


推荐阅读