rust 如何存储任意结构体并将其恢复为trait

7cwmlq89  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(145)

我如何存储一个任意的结构体,并在以后将其恢复为trait?
我不知道将被请求的trait。在某些情况下,结构体可能实现了trait,但在其他情况下,它可能不实现。
我尝试了面向对象的方法,将结构体存储为Any,然后将其向下转换为我需要的trait。然而,据我所知,这是不可能的,因为Rust没有运行时反射。

use std::{any::Any, collections::HashMap};

pub trait MyTrait {}

pub struct MyStruct {}
impl MyTrait for MyStruct {}

fn main() {
    let my_struct = MyStruct {};
    let as_any: Box<dyn Any> = Box::new(Box::new(my_struct));

    let mut hashmap = HashMap::new();
    hashmap.insert("key", as_any);

    // In this example, I try to downcast to my trait, but it could be an other trait elsewhere in the code.
    match hashmap.get_mut("key").unwrap().downcast::<Box<dyn MyTrait>>() {
        Some(_) => println!("Casting worked"),
        None => println!("Casting failed")
    }
}

编辑:添加更多细节。这是一个库,我不知道将存储在HashMap中的traits或struct。

ej83mcc0

ej83mcc01#

你可以用枚举来做类似的事情:

use std::any::Any;
use std::collections::HashMap;

pub enum MyEnum {
    MyTrait(Box<dyn MyTrait>),
    Any(Box<dyn Any>),
}

pub trait MyTrait {}

pub struct MyStruct {}
impl MyTrait for MyStruct {}

fn main() {
    let my_struct = MyStruct {};
    // let as_any: Box<dyn Any> = Box::new(Box::new(my_struct));

    let mut hashmap = HashMap::new();
    hashmap.insert("key", MyEnum::MyTrait(Box::new(my_struct)));

    // In this example, I try to downcast to my trait, but it could be an other trait elsewhere in the code.
    match hashmap.get_mut("key") {
        Some(my_val) => match my_val {
            MyEnum::MyTrait(_) => println!("its my trait"),
            MyEnum::Any(_) => println!("something else"),
        },
        None => println!("doesn't exist"),
    }
}

相关问题