我正在编写一个以通用方式实现前缀树的容器(键和值是通用参数)。由于这个数据结构的性质,我需要有一个迭代器的键。
从本质上讲,根据this question,IntoIterator特征是造成这种可能性的原因,但并不是所有的结构都实现它。例如,&str和String没有实现它。
在这种情况下,当IntoIterator不是由标准类型实现时,我该怎么办?
预期的API为
let mut t1 = Trie::new();
t1.insert(String::from("this"), 1);
let mut t2 = Trie::new();
t2.insert(vec![1, 2, 3], 1);发布于 2018-04-22 14:51:13
String和str的问题在于它们有两种类型的迭代器--基于UTF-8字符的chars()迭代器和基于字节的bytes()迭代器。这就是为什么不可能为这些类型实现IntoIterator的原因。您必须创建两个包装器(或选择其中一个)
struct ByteString(String)
struct Utf8String(String)并为它们实现IntoIterator。
发布于 2018-04-22 14:49:50
正如评论中所述,最简单的解决方案是创建一个包装器类型:
use ::std::iter::IntoIterator;
struct StringWrapper<'a>(&'a str);
impl<'a> IntoIterator for StringWrapper<'a> {
type Item = char;
type IntoIter = ::std::str::Chars<'a>;
fn into_iter(self) -> Self::IntoIter {
self.0.chars()
}
}
fn main() {
// Raw str
let wr = StringWrapper("test 1");
for c in wr {
println!("{}", c);
}
println!("-----");
// Reference to raw str
let s = "test 2";
let wr_s = StringWrapper(s);
for c in wr_s {
println!("{}", c);
}
println!("-----");
// reference to String
let owned_s = "test 3";
let wr_s_owned = StringWrapper(&owned_s);
for c in wr_s_owned {
println!("{}", c);
}
}https://stackoverflow.com/questions/49962611
复制相似问题