如何将一个变量作为另一个变量的数据类型?

7
如果我有一个变量存储了某样东西的数据类型,比如data_type,我该如何创建一个新变量,使其数据类型与data_type中定义的一致?
例如:
struct a {
    var: String,
}
struct b {
    var: String,
}

let var_type = "a";
let variable: var_type { var: "abc" };  // creates struct var_type

相关链接:https://dev59.com/h1cP5IYBdhLWcg3wi6gA - Sven Marnach
你可能想看看Serde。序列化/反序列化与你的问题有类似的问题空间--https://serde.rs/ - Ultrasaurus
3个回答

4
只要在编译时知道所有类型,就有可能根据数据中的某些值将非结构化数据转换为类型化数据。这正是流行的serde crate所做的事情。
不知道用例的情况下,很难精确回答问题,但下面的代码给出了两个示例,演示如何使用枚举完成类型映射(虽然可以使用match将任何数据映射到编译时已知的任何类型)。
enum VarType {
    A(String),
    B(String),
    Unknown(String),
}

fn main() {
    let _var1 = VarType::A("abc".to_string());
    let _var2 = VarType::B("xyz".to_string());

    let data = vec![("a", "abc"), ("b", "xyz")];

    for item in data {
        let (data_type, value) = item;
        match data_type {
            "a" => VarType::A(value.to_string()),
            "b" => VarType::B(value.to_string()),
            _ => VarType::Unknown(value.to_string()),
        };
    }
}

感谢您的贡献,但很遗憾那并不符合我的使用情况。 - Ariel Hurdle
@ArielHurdle你可以描述一下这个与你的用例有何不同吗? - SOFe

3
作为Isak van Bakel所说,大多数人认为锈是静态的。然而,如果你有所有可能结构的列表,你就可以做到 (假设你在这里使用serde!)。目前有一个有趣的问题正在讨论多态反序列化,建议您查看此处,因为它可能会有所帮助!

谢谢。那篇文章正是我一直在寻找的!! - Ariel Hurdle
很高兴我能帮到你。 - Leah Cornelius

0

不行。Rust 是静态类型语言。


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