Rust 中 String 的“Vec<String>”和 flatbuffers 向量的共同 API 是什么?
What's the common API for both `Vec<String>` and flatbuffers' vector of String in Rust?
我希望能够迭代 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.List
或 java.util.Iterator
。
Rust 中合适的签名是什么?
PS。显然我可以为每种情况提取一些带有适配器的新通用接口,但我更愿意只使用基本接口进行操作。
PPS。我忘了提到性能很重要,所以我宁愿尽可能避免创建新实例(如果它在 into_iter()
或 smth 的幕后使用)。
flatbuffers::Vector
does not implement AsRef<[T]>
but it does implement 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));
}
我希望能够迭代 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.List
或 java.util.Iterator
。
Rust 中合适的签名是什么?
PS。显然我可以为每种情况提取一些带有适配器的新通用接口,但我更愿意只使用基本接口进行操作。
PPS。我忘了提到性能很重要,所以我宁愿尽可能避免创建新实例(如果它在 into_iter()
或 smth 的幕后使用)。
flatbuffers::Vector
does not implement AsRef<[T]>
but it does implement 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));
}