为什么这个“通用” Rust代码无法按预期工作?

问题描述 投票:1回答:2

我最近开始学习Rust,并且正在尝试编写一个小的表达式评估程序。我已经练习了Rust几天了,以为与Rust的Traits一起工作会很酷。我试图做的是使Sum&Number结构实现Expression特质,以便我可以将([pun(无意间))(1 + 2)表示为expression,其中左右两侧也是表达式。我偶然发现了一个问题,即您不能只使用特征作为属性的类型,因此应该在本书中使用&dyn TraitBox。遵循此概念,对其进行了重写,现在可以进行编译,但是我无法访问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 traits
2个回答
0
投票

Rust不允许您转换非基本类型。

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


0
投票

我认为您要尝试的是此(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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.