[Rust枚举类型]: 如何在Rust中从混合类型的枚举中获取数据值?

4

你好,我刚接触 Rust,正在探索如何使用枚举。我有一个简单的代码,其中包含枚举。

#[derive(Debug)]
enum Thing {
    Str(String),
    Boolean(bool)
}

fn run() -> Vec<Thing> {
    let mut output: Vec<Thing> = Vec::new();
    output.push(Thing::Str("Hello".to_string()));
    output.push(Thing::Boolean(true));
    return output
}

fn main() {

    let result = run();
    for i in result {
        println!("{:?}", i)
    }
}


当我运行这段代码时,它能正常工作,但是我得到的输出如下所示。
Str("Hello")
Boolean(true)

我该如何获取类似这样的数值

"Hello"
true

因此,我可以使用这些值进行进一步处理,例如连接字符串或类似的操作。

感谢您的帮助。

1个回答

7
你正在使用 #[derive(Debug)] 宏,它自动为你的类型定义了 Debug trait。当调用 println!("{:?}", i) 时,{:?} 被称为 "print marker",表示 "使用 Debug trait 进行 Debug 格式化"。
但你想要使用的是 Display 格式化,这需要实现自定义的 Display trait。
首先,为 Thing 实现 Display
use std::fmt;

impl fmt::Display for Thing {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
           Thing::Str(s) => write!(f, "{}", s),
           Thing::Boolean(b) => write!(f, "{}", b),
        }
    }
}

接着,你应该可以调用:

println!("{}", i)

它将使用 Display trait 而不是 Debug trait。

如果你想学习更多关于格式化 traits 的知识,可以参考 "Rust By Example" 中的 DebugDisplay 示例。


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