我正在尝试创建一个映射,其中键是TypeId特征的一个,值是实现它的结构。
impls: HashMap<TypeId, Rc<dyn Any>>
Run Code Online (Sandbox Code Playgroud)
要将新对象添加到地图中,我使用以下代码:
let type_id = TypeId::of::<dyn Trait>();
let obj_ref: Rc<dyn Any> = Rc::new(obj);
self.impls.insert(type_id, Rc::clone(&obj_ref));
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从地图中获取这个对象时,我需要将其投射回来。
let any_comp_ref = self.impls
.get(&TypeId::of::<dyn Trait>())
.expect(&format!("Object for type: {} is not found", type_name::<dyn Trait>()));
let result: &dyn Trait = // ???
Run Code Online (Sandbox Code Playgroud)
我尝试过使用Rc::downcast. 但它仅针对Sized类型实现。
我的主要应用程序的代码如下所示:
pub fn load_lib() {
let dylib = libloading::Library::new("example.dylib") ...
unsafe { *dylib.get(b"fn_in_dylib") } ...
// calling function from dylib.
}
pub extern "Rust" fn fn_in_main_app() { ... } // Function that I want to call from dylib
Run Code Online (Sandbox Code Playgroud)
example.dylibdyliib 已成功加载,并且调用 dylib 中的函数没有任何问题。
但这是我在 dylib 中尝试做的事情:
pub extern "Rust" fn fn_in_dylib() {
fn_in_main_app(); // Here I'm trying to call function defined in main application.
}
extern "Rust" {
fn fn_in_main_app();
}
Run Code Online (Sandbox Code Playgroud)
但这甚至无法编译:
Undefined symbols for architecture x86_64:
"_fn_in_main_app", referenced from: …Run Code Online (Sandbox Code Playgroud)