rust - `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.List
or java.util.Iterator
。
Rust 中合适的签名是什么?
PS。显然,我可以为每种情况提取一些带有适配器的新通用接口,但我更喜欢仅使用基本接口进行操作。
聚苯乙烯。我忘了提到性能很重要,所以如果可能的话,我宁愿避免创建新实例(如果它在幕后使用的into_iter()
话)。
解决方案
flatbuffers::Vector
没有实现,AsRef<[T]>
但它确实实现了IntoIterator
,所以你可以让你的函数签名使用它。
fn take_iterator<'a>(iter: impl IntoIterator<Item=&'a str>) {}
此外,您的 flatbuffer 对象实际上使用&str
not 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));
}
推荐阅读
- python - 使用 Python 自动化 WhatsApp 并存储 WhatsApp 登录信息
- c++ - 从欧拉角转换为四元数时,C++ 中的小数偏差太大
- javascript - 将背景图像设置为全屏 React
- c++ - 我应该始终编码哪些字符?
- javascript - 想要获取实例数而不是字符数的innerText的长度条件
- android - 如何从 android 手机发送图像以佩戴 os watch?
- java - 如何使用 Java 在 Swing GUI 中单击按钮时打开一个新窗口
- vhdl - ModelSim 错误加载设计只是一个小小的 hello world 程序?
- json - UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte while inserting json data to database
- ios - 使用 bundle 解码本地 json 文件的预览过程似乎已崩溃