<String>Rust 中 String 的 'Vec' 和 flatbuffers 向量的通用 API 是什么?



我希望能够迭代字符串的Rust向量(Vec<String>(和字符串的flatbuffers向量:IDL,如下所示:

table Sitekeys {
domains: [string];
}

以下是文件的生成方式(使用flatc --rust ...(:

#[inline]
pub fn domains(&self) -> Option<flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<&'a str>>> {
...
}

我无法计算出同时接受两个向量的函数的签名。我认为它应该是最基本的接口(Rust中的trait(。来自J2EE/Android,我认为smth类似于java.util.Listjava.util.Iterator

Rust中合适的签名是什么?

PS。显然,我可以为每种情况提取一些新的带有适配器的通用接口,但我更喜欢只使用基本接口。

PPS。我忘了提到性能很重要,所以如果可能的话,我宁愿避免创建新实例(如果它在into_iter()或smth中的幕后使用(。

flatbuffers::Vector不实现AsRef<[T]>,但它实现了IntoIterator,因此您可以使用它进行函数签名。

fn take_iterator<'a>(iter: impl IntoIterator<Item=&'a str>) {}

此外,您的平面缓冲区对象实际上使用&str而不是String,您可以匹配两者并使用Vec<&str>:

fn main() {
let flatbuffer_v: flatbuffers::Vector<flatbuffers::ForwardsUOffset<&str>> = flatbuffers::Vector::default();
let std_v: Vec<&str> = Vec::new();
take_iterator(flatbuffer_v);
take_iterator(std_v);
}

或者,如果你有Vec<String>,只需参考:

fn main() {
let flatbuffer_v: flatbuffers::Vector<flatbuffers::ForwardsUOffset<&str>> = flatbuffers::Vector::default();
let std_v: Vec<String> = Vec::new();
take_iterator(flatbuffer_v);
take_iterator(std_v.iter().map(AsRef::as_ref));
}

相关内容

  • 没有找到相关文章

最新更新