我使用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是不同的.解决这个问题的任何方法?
| 归档时间: |
|
| 查看次数: |
176 次 |
| 最近记录: |