Rust 为什么&;str没有实现到迭代器中吗?
我正在编写一个以通用方式实现前缀树的容器(键和值是通用参数)。由于这种数据结构的性质,我需要有迭代器的键 本质上,根据IntoIterator的Rust 为什么&;str没有实现到迭代器中吗?,rust,Rust,我正在编写一个以通用方式实现前缀树的容器(键和值是通用参数)。由于这种数据结构的性质,我需要有迭代器的键 本质上,根据IntoIterator的,trait负责这种可能性,但并非所有结构都实现了它。例如,&str和String不实现它 在这种情况下,如果标准类型没有实现IntoIterator,我应该怎么做 预期的API是 let mut t1 = Trie::new(); t1.insert(String::from("this"), 1); let mut t2 = Trie::new()
,trait负责这种可能性,但并非所有结构都实现了它。例如,&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);
如注释中所述,最简单的解决方案是创建包装器类型:
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);
}
}
use::std::iter::IntoIterator;
StringWrapper结构{
类型项=字符;
键入IntoIter=::std::str::Chars字符串和str
的问题是它们有两种类型的迭代器-Chars()
-UTF-8字符迭代器和bytes()
-字节迭代器。这就是为什么不可能为这些类型实现IntoIterator
。您必须创建两个包装器(或选择其中一个)
你可以编写一个包装器类型并为它实现trait。另外,为什么string.iter()
不够用?@BernardoMeurer请查看更新的问题。据我所知,没有trait需要实现iter()
@BernardoMeurer除了泛型在这种情况下工作需要有一个特性之外,str
、&str
、String
和&String
似乎都没有iter()方法。
struct ByteString(String)
struct Utf8String(String)