【发布时间】:2020-09-07 03:58:19
【问题描述】:
我有一个包含许多嵌套表的 flatbuffers 架构。在Typescript flatbuffers 中,我能够让每个表公开一个to_offset 函数,该函数在创建时为表返回WIPOffset。然后我可以将结果分配给更高级别类型的嵌套字段,并且效果很好。
在 Rust flatbuffers 中,我无法完成这项工作,因为它需要多个可变借用,这当然是不允许的。
您有什么方法推荐使用像这样的嵌套架构,其中在整个架构中以更高级别的类型使用各种表?
这是我想做的一个粗略的例子:
table A {
f1: string;
}
table B {
fa: A;
f2: uint;
}
table C {
fa: A;
f3: ushort;
}
fn build_a_offset<'a>(fbb: &'a mut FlatBufferBuilder) -> WIPOffset<A<'a>> {
let args = AArgs {...
};
let a = A::create(fbb, &args);
a
}
fn build_b_buf() -> Vec<u8> {
let mut fbb = FlatBufferBuilder::new_with_capacity(1024);
let a_offset = build_a_offset(&mut fbb);
let b_args = BArgs {
a: a_offset,
f2: 30u32,
}
let b = B::create(&mut fbb, f_args);
fbb.finish(b);
fbb.finished_data().to_vec()
}
任何关于如何正确构建它的建议都会非常有帮助。
【问题讨论】:
-
我相信答案是不可能的,一个 FlatBufferBuilder 实例只能被可变地借用一次。我还检查了 Rust Flatbuffers 集成测试,它们的工作方式相同(一个实例有一个借用,除非它是一个循环,然后他们使用重置但仍然只有 1 个借用)。如果我遗漏了什么,请告诉我,否则我会解决这个问题。
-
当然,FlatBuffers API 允许这样做,其中包含的示例和测试可以做到这一点。你读过google.github.io/flatbuffers/flatbuffers_guide_tutorial.html(选择“Rust”)吗?
-
我确实阅读了这些示例,但它们并不是我需要做的。我找到了解决方案,它只是以正确的方式使用生命周期。我会发布一个答案。
标签: rust flatbuffers