微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Rust 中 String 的 `Vec<String>` 和 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 中合适的签名是什么?

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

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

解决方法

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

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

此外,您的 flatbuffer 对象实际上使用 &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));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。