与struct children

时间:2017-04-15 01:01:05

标签: indexing reference rust

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

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

我考虑过的其他选项:将每个记录的模式副本存储起来会浪费,或者将模式存储在一个框中并在每个记录中存储对它的引用(似乎是最不繁琐的,但仍然不满意)。

我错过了解决这个问题的好方法吗?

1 个答案:

答案 0 :(得分:0)

你没有发布很多代码,但我想你想要使用以下内容从记录中获取列信息:

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)
    }
}