我正在尝试为数据库文件格式实现一个解析器。从概念上讲,我正在尝试定义如下结构:
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/