Rust中绕过对象安全Trait限制实现多类型列数据库表的方案咨询
Rust中绕过对象安全Trait限制实现多类型列数据库表的方案咨询
我正在用Rust写一个玩具数据库的实现,卡在了Trait的对象安全要求上。我本质上想找一种在Rust里用不同类型列表示数据库表的方法。
以下是我目前完成的数据存储部分的简化代码:
trait Primitive {} impl Primitive for i32 {} struct Table { value: HashMap<String, Arc<dyn ColType>>, } trait ColType { fn get_data(&self) -> &Vec<impl Primitive>; } struct TableValue<T: Primitive> { data: Vec<T> } impl <T: Primitive> ColType for TableValue<T> { fn get_data(&self) -> &Vec<T> { return &self.data; } }
这段代码会报出警告:ColType无法被构造成对象。我只是想让这段代码或者类似的方案能编译通过,我的核心需求如下:
- 我需要
Primitive是一个Trait(已在i32等类型上实现)。不想用枚举,因为我不知道怎么确保每个列的所有值都是同一个枚举变体,而且还要考虑枚举带来的额外开销问题。 - 我不想用
Vec<Box<impl Primitive>>这类写法,我觉得肯定有办法不用这么糟糕的实现——毕竟Vec<T> where T: Primitive就能正常工作,为什么要给每个元素都加一个新指针呢! - 解决方案必须能正常存储数据(我之前试过给
ColType加泛型参数,写成ColType<T: Primitive>,然后用HashMap<String, Arc<dyn ColType<dyn Primitive>>>,结果最后出现了根本无法满足的Trait约束)。
我脑子里觉得应该可以返回某种堆分配的、类型为Vec<impl ColType + Sized>的向量,但可能只是我一厢情愿的想法,想请教大家有没有可行的解决思路。
备注:内容来源于stack exchange,提问作者some1and2
相关产品推荐
相关产品推荐

