问题描述
我有一个flatbuffers模式,其中包含许多嵌套表。在Typescript
平面缓冲区中,我能够让每个表公开一个to_offset
函数,该函数在创建时为该表返回WIPOffset
。然后,我可以将结果分配给更高级别的嵌套字段,并且效果很好。
在Rust平面缓冲区中,我无法完成这项工作,因为它需要多个可变的借用,这当然是不允许的。
您是否建议以任何方式使用这样的嵌套模式,其中在整个模式中以更高级别的类型使用各种表?
这是我想做的一个粗略例子:
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
引用的签名更改为此:
fbb: &'mut FlatBufferBuilder<'fbb>
它是附加后缀生存期,而不是引用之前的生存期。这是因为前缀的生存期控制着 reference 的生命周期,而所需的是控制引用中包含的 data 的生命周期(即附加在{ {1}}在Rust中使用。
最好在本教程中添加诸如此类的示例。如果您需要的话,我可以在某个时候提供帮助。