我可以在循环中使用 itertools::PutBack::put_back 吗?
Can I use itertools::PutBack::put_back in a loop?
我的用例:
- 遍历字符串
- 对词法分析器状态机中的每个字符作出反应
- 看到一些字符,意识到前一个字符是其令牌的结尾
- 完成令牌
- 转换回 Empty 状态(意味着没有标记被部分构建)
- 使用
put_back
将 "extra" 字符推回迭代器
- 继续状态机处理,其中放回的字符将可用于下一个标记中的第一个字符。
这是一个尝试的例子:
use itertools::put_back; // 0.8.0
fn main() {
let hello = "Hello world".to_owned();
let hello_iter = hello.chars();
let mut putback_iterator = put_back(hello_iter);
let mut already_putback = false;
for c in putback_iterator {
if c == 'd' && !already_putback {
putback_iterator.put_back('!');
already_putback = true;
}
println!("Char is {}", c.to_string());
}
}
错误信息:
error[E0382]: borrow of moved value: `putback_iterator`
--> src/main.rs:10:13
|
6 | let mut putback_iterator = put_back(hello_iter);
| -------------------- move occurs because `putback_iterator` has type `itertools::adaptors::PutBack<std::str::Chars<'_>>`, which does not implement the `Copy` trait
7 | let mut already_putback = false;
8 | for c in putback_iterator {
| ---------------- value moved here
9 | if c == 'd' && !already_putback {
10 | putback_iterator.put_back('!');
| ^^^^^^^^^^^^^^^^ value borrowed here after move
我将如何遍历字符并执行 put_back
?我找不到任何使用 put_back
.
的有效示例
for
循环允许您迭代任何实现 IntoIterator
的东西。这个特征定义了 into_iter(self)
消耗它被调用的对象和 returns 一个迭代器。即使 self
已经是一个迭代器(因为它在您的代码中)也是如此。
因此,for
循环消耗了迭代器,使其在循环内不可访问。
另一种方法是使用 while let
循环:
use itertools::put_back; // 0.8.0
fn main() {
let hello = "Hello world".to_owned();
let hello_iter = hello.chars();
let mut putback_iterator = put_back(hello_iter);
let mut already_putback = false;
while let Some(c) = putback_iterator.next() {
if c == 'd' && !already_putback {
putback_iterator.put_back('!');
already_putback = true;
}
println!("Char is {}", c.to_string());
}
}
我的用例:
- 遍历字符串
- 对词法分析器状态机中的每个字符作出反应
- 看到一些字符,意识到前一个字符是其令牌的结尾
- 完成令牌
- 转换回 Empty 状态(意味着没有标记被部分构建)
- 使用
put_back
将 "extra" 字符推回迭代器
- 继续状态机处理,其中放回的字符将可用于下一个标记中的第一个字符。
这是一个尝试的例子:
use itertools::put_back; // 0.8.0
fn main() {
let hello = "Hello world".to_owned();
let hello_iter = hello.chars();
let mut putback_iterator = put_back(hello_iter);
let mut already_putback = false;
for c in putback_iterator {
if c == 'd' && !already_putback {
putback_iterator.put_back('!');
already_putback = true;
}
println!("Char is {}", c.to_string());
}
}
错误信息:
error[E0382]: borrow of moved value: `putback_iterator`
--> src/main.rs:10:13
|
6 | let mut putback_iterator = put_back(hello_iter);
| -------------------- move occurs because `putback_iterator` has type `itertools::adaptors::PutBack<std::str::Chars<'_>>`, which does not implement the `Copy` trait
7 | let mut already_putback = false;
8 | for c in putback_iterator {
| ---------------- value moved here
9 | if c == 'd' && !already_putback {
10 | putback_iterator.put_back('!');
| ^^^^^^^^^^^^^^^^ value borrowed here after move
我将如何遍历字符并执行 put_back
?我找不到任何使用 put_back
.
for
循环允许您迭代任何实现 IntoIterator
的东西。这个特征定义了 into_iter(self)
消耗它被调用的对象和 returns 一个迭代器。即使 self
已经是一个迭代器(因为它在您的代码中)也是如此。
因此,for
循环消耗了迭代器,使其在循环内不可访问。
另一种方法是使用 while let
循环:
use itertools::put_back; // 0.8.0
fn main() {
let hello = "Hello world".to_owned();
let hello_iter = hello.chars();
let mut putback_iterator = put_back(hello_iter);
let mut already_putback = false;
while let Some(c) = putback_iterator.next() {
if c == 'd' && !already_putback {
putback_iterator.put_back('!');
already_putback = true;
}
println!("Char is {}", c.to_string());
}
}