Indexing 与结构子级共享架构

Indexing 与结构子级共享架构,indexing,reference,rust,Indexing,Reference,Rust,我正在尝试为数据库文件格式实现一个解析器。从概念上讲,我试图定义如下所示的结构: struct Database { schema: Vec<FieldDescriptors>, records: Vec<Record>, } 结构数据库{ 模式:Vec, 记录:Vec, } Record基本上只是一个Vec。为了从记录中提取列,它需要引用模式(以了解要读取的字节)。我尝试了几种设计,但都没有成功: 1) 让记录结构存储对数据库或模式的引用(偶然发现这

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

struct Database {
    schema: Vec<FieldDescriptors>,
    records: Vec<Record>,
}
结构数据库{ 模式:Vec, 记录:Vec, }
Record
基本上只是一个
Vec
。为了从记录中提取列,它需要引用模式(以了解要读取的字节)。我尝试了几种设计,但都没有成功:

1) 让
记录
结构存储对
数据库
或模式的引用(偶然发现这个答案:,我理解为什么它不起作用)

2) 为记录数据(存储在数据库结构中)和可以实际返回相应列的记录(根据需要创建)创建不同类型的记录。记录包含对数据的引用和对架构的引用。这很好,只是我希望能够实现
索引
特性来访问记录。不幸的是,
index
必须返回一个引用,所以我不能按需返回新的代理对象。(目前显然也不可能做到)

我考虑过的其他选择:将模式的副本与每条记录一起存储,这将是浪费,或者将模式存储在一个框中,并在每条记录中存储对它的引用(看起来最简单,但仍然不令人满意)


我是否错过了解决这个问题的好办法

您没有发布太多代码,但我认为您希望使用以下方法从记录中获取列信息:

impl Record {
   fn get_column(&self, index: usize) -> Column {
       // use self.schema to get the column...
   }
}
另一种完全不同的设计是将此代码和模式关联起来,并在需要模式对其执行某些操作时传递一个
&Record
。您可以通过使用facade来保护任何用户不必直接处理模式,facade可以是
数据库
本身:

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)
    }
}
结构模式{ 字段描述符:Vec } 结构数据库{ schema:schema, 记录:Vec, } impl模式{ fn get_列(&self,记录:&record,索引:usize)->column{ //使用self.field\u描述符获取列。。。 } } impl数据库{ fn获取列(&self,行:usize,列索引:usize)->column{ schema.get\u列(&self.records[row],col\u索引) } }
如何使用?仅在解码时传入对架构的引用,而不是作为
记录的属性
?单独存储模式,不捆绑它们吗?使用ref?RC似乎有些过分,因为模式的寿命与数据库的寿命一样长。我想把它们捆绑起来,因为我认为模式是一个内部细节。拥有_ref看起来可能是我想要的,但我有点困惑如何使用它。我想我想从这里开始学习RcRef的例子,对吗?为了从记录中获取一列,用户是否仍然需要创建对象?我希望他们可以做一些类似于
数据库[I].get\u列(2)
的事情。理想情况下,用户不必关心架构。@BenJones如果您通过
数据库
结构访问它,那么您可以处理该额外参数,这样用户就不必关心架构了。我更新了代码以包含这一点。