indexing - 与结构 child 共享模式

标签 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 )

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

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

最佳答案

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

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/

相关文章:

c++ - 返回原始类型和结构的本地对象

c++ - 为什么不能分配引用的目标对象?

c++ - C++中的引用和常量混淆

json - 使用 Serde 反序列化跳过序列中的无效元素

postgresql - 在 Rust 中关闭 PostgreSQL 客户端连接

rust - 如何在没有克隆的情况下更改对拥有值的引用?

python - 如何在给定列值的情况下获取 pandas dataframe 系列名称?

mongodb - 在 mongodb 中,为什么查询索引子文档数组比索引一级文档更快?

python - swaplevel() 和 reorder_levels() 有什么区别?

java - 通过基于索引检索 Hashmap 元素