Rust中的向量可以存储混合类型的数据。

14
在将中缀表达式转换为后缀表达式的上下文中,使用Shunting-yard算法。我想使用一个向量来存储输出,其中包含操作符和数字类型数据。

在使用Shunting-yard算法将中缀表达式转换为后缀表达式的过程中,我希望使用一个向量来存储输出结果,这个向量将同时存储操作符和数字类型的数据。

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Operator {
    Add,
    Sub,
    Mul,
    Div,
}

fn main() {
    let mut output: Vec<String> = Vec::new();  // create an output vector
    let a = 2;
    let b = Operator::Add;
    let c = 3;
    output.push(a.to_string());
    output.push(b.to_string());
    output.push(c.to_string());
}

显然,上面的代码无法编译,因为to_string()方法没有为Operator定义。我看到两种修复方式:

  1. 定义一个to_string()方法
  2. 创建一个向量来存储数字和Operator的引用。

我认为第二种是更好的选择,虽然我不知道创建引用向量是否会引入很多复杂性。

1个回答

23

不需要使用引用,只需直接在枚举中存储数字和Operator:

enum Thing {
    Op(Operator),
    Number(i32),
}

fn main() {
    let mut output: Vec<Thing> = Vec::new();
    let a = 2;
    let b = Operator::Add;
    let c = 3;
    output.push(Thing::Number(a));
    output.push(Thing::Op(b));
    output.push(Thing::Number(c));
}

然后在拿出它们时匹配


1
我明白了。由于枚举的大小相同,非常感谢! - enaJ
请注意,枚举类型的大小取决于其最大选项。如果您的Thing还有一个大数组选项,则向量中每个Thing实例都将具有大数组的内存占用。 - sam
1
你能否给出一个示例代码,演示如何迭代这个向量并检查其类型...谢谢! - Sydalmighty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接