Rust:如何为组合的dict/数组条目建模
我正在与一个C库交互,该库提供了Rust:如何为组合的dict/数组条目建模,rust,Rust,我正在与一个C库交互,该库提供了数组(列表)和字典(键+值)功能。生产和消费我试图在Rust中建模的Entrys。那些Entrys可以是基本类型,但也可以是Arrays或Dictionarys本身持有Entrys。作为一项附加要求,对条目的任何更改都必须通过函数调用转发到底层C库 可用类型 串 整数 布尔值 数组(这些类型的列表;允许混合类型) 字典(这些类型的键+值;允许混合) 要求 构建这些类型任意组合的层次结构。允许筑巢 将对条目的任何更改写回C库 以serde作为如何建模JSON
数组
(列表)和字典(键+值)功能。生产和消费我试图在Rust中建模的Entry
s。那些Entry
s可以是基本类型,但也可以是Array
s或Dictionary
s本身持有Entry
s。作为一项附加要求,对条目的任何更改都必须通过函数调用转发到底层C库
可用类型
- 串
- 整数
- 布尔值
- 数组(这些类型的列表;允许混合类型)
- 字典(这些类型的键+值;允许混合)
要求
- 构建这些类型任意组合的层次结构。允许筑巢
- 将对
条目的任何更改写回C库
以serde
作为如何建模JSON结构的参考,我尝试将这些Entry
s构建为enum
:
enum条目{
串(串),,
整数(i32),
布尔(布尔),
阵列(Vec),
Dict(HashMap)
}
这很有效
现在我尝试实现我的附加需求:将对条目的任何更改
转发到底层的C库。因此,我添加了从C库中获得的引用作为id
:
enum条目{
字符串{value:String,id:isize},
整数{value:i32,id:isize},
布尔值{value:bool,id:isize},
数组{value:Vec,id:isize},
Dict{value:HashMap,id:isize}
}
现在,我只需要确保在更新条目时调用C库中的update(id,value)
。因此,我添加了getter/setter方法并完成了。嗯,我不能这样做,因为我不能在枚举变量(例如Entry::String)上实现
看来我走到了死胡同
第二种方法:泛型结构
trait EntryTypes{}
字符串{}的impl EntryTypes
i32{}的impl入口类型
布尔{}的impl入口类型
发布结构条目{
id:isize,
值:T,
}
特征入口型{
fn值(&self)->T;
fn设置_值(&mut self,值:T);
}
导入{
fn新(值:T,id:isize)->Self{
自我{值,id}
}
}
这适用于简单类型,但我无法让它与Vec
和HashMap
一起使用:
Vec{}的impl入口类型
编译时无法知道类型`(dyn EntryTypes+'static)`的值的大小
我需要如何处理这个问题?在Rust中,您应该定义与C对应结构等效的结构;只要它们是#[repr(C)]
,指向它们的指针就可以在FFI上来回传递。人们通常使用bindgen直接从C头文件自动生成它们(以及任何导入的函数声明),例如作为构建脚本的一部分。@eggyal感谢您的评论,唉,我的问题不是关于FFI(我使用bindgen构建了与C库的连接),而是关于在Rust中建模数据结构。我真的很想理解这样做的惯用方式。在这种情况下,我认为你应该重新措辞这个问题,删除所有对外国金融机构的引用,因为它们会分散你对完全无关的问题的注意力?