gpt4 book ai didi

indexing - 与结构 child 共享模式

转载 作者:行者123 更新时间:2023-11-29 08:01:21 25 4
gpt4 key购买 nike

我正在尝试为数据库文件格式实现一个解析器。从概念上讲,我正在尝试定义如下结构:

struct Database {
schema: Vec<FieldDescriptors>,
records: Vec<Record>,
}

Record基本上只是一个 Vec<u8> .为了从记录中提取列,它需要引用一个模式(以知道要读取哪些字节)。我曾尝试实现多种设计,但均未成功:

1) 有Record结构存储对 Database 的引用或模式(偶然发现这个答案:Why can't I store a value and a reference to that value in the same struct?,我明白为什么它不起作用)。

2) 为记录数据创建不同类型(存储在数据库结构中),以及一个可以实际返回适当列的记录(在需要时按需创建)。记录包含对数据的引用和对架构的引用。这工作正常,除了我希望能够实现 Index访问记录的特征。不幸的是,index必须返回一个引用,所以我不能按需返回一个新的代理对象。 (目前显然也无法做到 Implementing Index trait to return a value that is not a reference )

我考虑过的其他选项:将模式的副本与每条记录一起存储会很浪费,或者将模式存储在一个盒子中并在每条记录中存储对它的引用(看起来最不麻烦,但仍然不令人满意) .

我是否缺少解决此问题的好方法?

最佳答案

你没有发布太多代码,但我想你想使用类似的东西从记录中获取列信息:

impl Record {
fn get_column(&self, index: usize) -> Column {
// use self.schema to get the column...
}
}

一个完全不同的设计是将此代码与架构相关联,并在您需要架构对其执行某些操作时传递 &Record。您可以通过使用外观来保护任何用户不必直接处理模式,外观可以是 Database 本身:

struct Schema {
field_descriptors: Vec<FieldDescriptors>
}

struct Database {
schema: Schema,
records: Vec<Record>,
}

impl Schema {
fn get_column(&self, record: &Record, index: usize) -> Column {
// use self.field_descriptors to get the column...
}
}

impl Database {
fn get_column(&self, row: usize, col_index: usize) -> Column {
schema.get_column(&self.records[row], col_index)
}
}

关于indexing - 与结构 child 共享模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com