Rust:如何为组合的dict/数组条目建模

Rust:如何为组合的dict/数组条目建模,rust,Rust,我正在与一个C库交互,该库提供了数组(列表)和字典(键+值)功能。生产和消费我试图在Rust中建模的Entrys。那些Entrys可以是基本类型,但也可以是Arrays或Dictionarys本身持有Entrys。作为一项附加要求,对条目的任何更改都必须通过函数调用转发到底层C库 可用类型 串 整数 布尔值 数组(这些类型的列表;允许混合类型) 字典(这些类型的键+值;允许混合) 要求 构建这些类型任意组合的层次结构。允许筑巢 将对条目的任何更改写回C库 以serde作为如何建模JSON

我正在与一个C库交互,该库提供了
数组
(列表)和字典(键+值)功能。生产和消费我试图在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中建模数据结构。我真的很想理解这样做的惯用方式。在这种情况下,我认为你应该重新措辞这个问题,删除所有对外国金融机构的引用,因为它们会分散你对完全无关的问题的注意力?