首页 > 解决方案 > `Vec 的通用 API 是什么Rust中字符串的`和flatbuffers'向量?

问题描述

我希望能够遍历 String ( Vec<String>) 的 Rust 向量和flatbuffers的字符串向量:IDL 如下:

table Sitekeys {
  domains: [string];
}

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

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

我无法确定可以接受两个向量的函数的签名。我相信它应该是最基础的接口(trait在 Rust 中)。来自 J2EE/Android,我认为 smth 类似于java.util.Listor java.util.Iterator

Rust 中合适的签名是什么?

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

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

标签: rustiteratorflatbuffers

解决方案


flatbuffers::Vector没有实现,AsRef<[T]>但它确实实现了IntoIterator,所以你可以让你的函数签名使用它。

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

此外,您的 flatbuffer 对象实际上使用&strnot String,您可以同时匹配并使用 a 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));
}

推荐阅读