我有一个带有许多嵌套表的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()
}
关于如何正确构建此结构的任何建议将非常有帮助。
最佳答案
我确实找到了答案,但我没有正确使用生命周期。
fn build_a_offset<'a>(fbb: &'mut FlatBufferBuilder<'fbb>) -> 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()
}
我需要将fbb
ref的签名更改为:fbb: &'mut FlatBufferBuilder<'fbb>
它是在添加后缀生存期而不是在引用之前的生存期。这是因为预定的生存期控制了引用的生存期,而所需的是控制引用中包含的数据的生存期(即,附加的<'fbb>
在Rust中的作用)。最好为该示例添加更多示例。如果需要的话,我可以在某个时候提供帮助。
关于rust - 有没有推荐的模式来构建具有嵌套类型的Flatbuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63771146/