gpt4 book ai didi

rust - 如何在不消耗迭代器int rust的情况下获取元素(在rust中重写strtol的问题)

转载 作者:行者123 更新时间:2023-12-03 11:40:38 25 4
gpt4 key购买 nike

我在Rust中实现了strtol,如下所示:

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
}
Playground link

关于rust - 如何在不消耗迭代器int rust的情况下获取元素(在rust中重写strtol的问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66044652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com