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

Fen*_*Cen 9 rust

我使用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) => Some(value),
                None => None,
            }
        }
        None => None,
    }
}
Run Code Online (Sandbox Code Playgroud)

对不起,我的描述很糟糕.

更新:

TypeId测试结果:

# in dylib's function:
Router TypeId: TypeId { t: 10245301028242226491 }
String TypeId: TypeId { t: 2231836747111135853 }

# in `main.rs`'s function:
Router TypeId: TypeId { t: 11005875220745415326 }
String TypeId: TypeId { t: 2231836747111135853 }
Run Code Online (Sandbox Code Playgroud)

TypeId是不同的.解决这个问题的任何方法?

Mat*_* M. 5

如前所述,到目前为止(1.10),TypeId跨包或编译并不稳定。

@eddyb 本周刚刚提出了一个拉取请求,该请求创建了TypeId独特的跨板条箱,这将使您的特定用例成为可能。

值得注意的是,这种稳定性并不完全;例如,如果您阅读注释,您会注意到TypeId如果编译器版本或板条箱版本发生变化,则可能会发生变化。尽管如此,对于单个编译器和共享依赖项,它现在在重新编译中保持稳定。

现在,您可以使用夜间编译器,或者等到包含此补丁的下一个稳定版本(我想是 1.12 或 1.13)。