首页 > 解决方案 > 如何在不消耗迭代器 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

标签: rustiteratorstrtol

解决方案


您的代码失败,因为您查看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
}

游乐场链接


推荐阅读