我使用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) 我想生成一个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
两个Article
和Comment
:
pub trait FieldsMapping {
fn get_fields_map(&self) -> HashMap<String, usize>;
}
Run Code Online (Sandbox Code Playgroud)
我想为自定义派生编写一个编译器插件FieldsMapping
.
我的问题是:如何在编译器插件中获取所有字段?我怎么知道字段类型是Vec
什么?