我正在尝试为数据库文件格式实现解析器。从概念上讲,我试图定义如下结构:
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)
我考虑过的其他选项:将每个记录的模式副本存储起来会浪费,或者将模式存储在一个框中并在每个记录中存储对它的引用(似乎是最不繁琐的,但仍然不满意)。
我错过了解决这个问题的好方法吗?
答案 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)
}
}