小编Fen*_*Cen的帖子

Box <Any> downcast在dylib模块中返回无

我使用dylib作为插件解决方案.当我调用函数时register(在下面的代码中,fun是我的项目名称):

let register = plugin.get::<unsafe extern fn(&mut fun::mem::Mem)>("register").unwrap();
unsafe {
    register(&mut mem);
}
Run Code Online (Sandbox Code Playgroud)

在dylib的register函数中,mem.get_mut::<fun::router::Router>("router")返回None

但是,如果使用mem.get_mut::<fun::router::Router>("router")main.rs.它Router按我的意愿返回.

我测试更多并得到以下结果:

在dylib中:

  • mem.get_mut::<String>("test") 工作得很好.
  • mem.get_mut::<fun::Bob>("bob")回来None.

main.rs:

  • mem.get_mut::<String>("test") 工作得很好.
  • mem.get_mut::<fun::Bob>("bob") 工作得很好.

我的问题:

为什么downcast_mut如果在主模块中定义了downcast的泛型类型,则在dylib中返回None?

mem结构:

#[derive(Debug)]
pub struct Mem {
    pub value: HashMap<String, Box<Any>>,
}
Run Code Online (Sandbox Code Playgroud)

get_mut:

pub fn get_mut<T: Any>(&mut self, key: &str) -> Option<&mut T> {
    match self.value.get_mut(key) {
        Some(val) => {
            match val.downcast_mut::<T>() {
                Some(value) …
Run Code Online (Sandbox Code Playgroud)

rust

9
推荐指数
1
解决办法
176
查看次数

如何在编译器插件中获取struct字段和字段类型?

我想生成一个HashMap使用struct字段作为键,并使用usize整数作为值.

pub struct Article {
    title: String,
    content: String,
    category: String,
    comments: Vec<Comment>
}

pub struct Comment {
    content: String
}
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:

{
    title: 0,
    content: 1,
    category: 2
    comments[].content: 3
}
Run Code Online (Sandbox Code Playgroud)

我的解决办法是impl我的特质FieldsMapping两个ArticleComment:

pub trait FieldsMapping {
    fn get_fields_map(&self) -> HashMap<String, usize>;
}
Run Code Online (Sandbox Code Playgroud)

我想为自定义派生编写一个编译器插件FieldsMapping.

我的问题是:如何在编译器插件中获取所有字段?我怎么知道字段类型是Vec什么?

rust rust-compiler-plugin rustc-serialize

1
推荐指数
1
解决办法
138
查看次数