You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 08:48:05