rust - 如何在不消耗迭代器 int rust 的情况下获取元素(在 rust 中重写 strtol 的问题)
问题描述
我strtol
在 Rust 中这样实现:
fn strtol(chars: &mut Chars<'_>) -> i64 {
let mut result: i64 = 0;
loop {
match chars.next() {
Some(c) => {
match c.to_digit(10) {
Some(i) => result = result * 10 + i64::from(i),
None => break,
}
},
None => break,
}
}
result
}
问题是在运行之后strtol
,迭代器指向数字后的第二个字符,它应该指向数字后的第一个字符。例如输入“1234abc”,调用 后strtol
,迭代器指向的b
应该是a
。
解决方案
您的代码失败,因为您查看chars.next
它是否是有效数字然后停止如果不是。正如您所观察到的,这意味着将消耗第一个非数字。要解决此问题,您可以传入一个Peekable
:
use std::iter::Peekable;
fn strtol<I: Iterator<Item = char>>(chars: &mut Peekable<I>) -> i64 {
let mut result: i64 = 0;
loop {
// first peek the element here
match chars.peek() {
Some(c) => match c.to_digit(10) {
Some(i) => result = result * 10 + i64::from(i),
None => break,
},
None => break,
}
// at this point we know it's a digit so we consume it
chars.next();
}
result
}
fn main() {
let test = "1234abcd";
let mut iter = test.chars().peekable();
println!("{}", strtol(&mut iter)); // 1234
println!("{}", iter.collect::<String>()); // abcd
}
推荐阅读
- javascript - Firebase - 从孩子那里获取数据有时会返回未知数
- http - Launch4j exe没有http请求?
- python - 将具有多列的数组保存到 csv
- python - Selenium:元素不可点击,因为其他元素遮住了它
- azure - 在 Azure DevOps 中将相同的工作项添加到两个不同的 sprint
- excel - 在 VBA 中将列类型范围转换为日期(匹配函数)
- javascript - 具有反应状态的过滤器不过滤值
- tensorflow - 在 tf.keras 中使用三个变量创建自定义分段损失函数
- memory-management - 你如何转换一个盒子
到 Rc ? - python - 如何在 Python 中按类创建对象并从列表中获取信息?