下面的代码不会编译:
use std::str::Chars;
struct Chunks {
remaining: Chars,
}
impl Chunks {
fn new(s: String) -> Self {
Chunks {
remaining: s.chars(),
}
}
}
错误为:
error[E0106]: missing lifetime specifier
--> src/main.rs:4:16
|
4 | remaining: Chars,
| ^^^^^ expected lifetime parameter
Chars
不拥有它所迭代的字符,并且它不能比创建它的&str
或String
更有效。
是否存在不需要生存期参数的Chars
自有版本,或者我必须自己保留Vec<char>
和索引?
6条答案
按热度按时间57hvy0tb1#
还有owned-chars crate,它
为String提供了一个扩展特性,它有两个方法,into_chars和into_char_indices。这两个方法并行于String::chars和String::char_indices,但是它们创建的迭代器消耗String而不是借用它。
iq0todco2#
在某种意义上,
std::vec::IntoIter
是每个迭代器的自有版本。Playground link
缺点是额外的分配和空间开销,但我不知道您的具体情况下的迭代器。
cwtwac6a3#
衔尾蛇
可以使用ouroboros crate创建一个包含
String
和Chars
迭代器的自引用结构:另见:
租金
可以使用rental crate创建一个包含
String
和Chars
迭代器的自引用结构:另见:
woobm2wo4#
下面是一个没有
unsafe
的解决方案。它提供了与
s.chars().collect::<Vec<_>>().into_iter()
相同的效果,但没有分配开销。而且,它可能是尽可能快地得到它,它不重新分配,不重复迭代,它只是从一个字符到另一个字符,每一步都是
O(1)
,给你一个O(n)
的总迭代,同时这也是迭代的下界。最重要的是,它不是自我参照的,所以这种方法可能就是你想要的,它结合了其他答案的所有优点,没有任何缺点。
再加上一点特质魔力:
您可以:
hgc7kmma5#
从How can I store a Chars iterator in the same struct as the String it is iterating on?复制:
7jmck4yq6#
你可以实现自己的迭代器,或者像这样 Package
Chars
(只有一个小的unsafe
块):参见playground