如何为锈中的每个循环继续迭代a中的下一个字符

问题描述 投票:0回答:1

我正在编写一个简单的令牌生成器,它将从它的新函数中获取输入(希望将其取而代之以使用REPL),并吐出与css语法关联的令牌。

这里是一个例子:

#[derive(Debug)]
pub enum Token {
    Selector,
    LBrace,
    RBrace,
    Property,
    Value,
}

#[derive(Debug)]
pub struct Tokenizer {
    source: String,
    tokens: Vec<(Token, String)>,
}

impl Tokenizer {
    pub fn new(source: &str) -> Self {
        let source = source.to_string();

        for (i, c) in source.chars().enumerate() {
            if c == '.' {
                // This is where I am stuck.
            }
        }

        Self {
            source,
            tokens: vec![],
        }
    }
}

fn main() {
    let tokens = Tokenizer::new(".example{}");
    println!("{:#?}", tokens);
}

现在我的问题是我要遍历下一个字符,直到遇到# 'space'.中的一个为止,但我不知道生锈如何使我保持迭代直到满足条件。是否可以调用序列中的下一个字符?

[如果您在我所遵循的指导方针范围内确实发现此代码有任何问题,请告诉我。谢谢。

这里是rust playground的链接。

loops rust token lex
1个回答
0
投票

由于这是一个非常广泛的问题,我将参考servo's css-parser

一些可能派上用场的功能:

  • [skip_while可以在开头满足特定谓词的条件下跳过元素
  • [skip_while创建一个可以向前看的迭代器

除了使用迭代器,您还可以使用切片(peekable)。这可能更容易,因为(普通的)迭代器基本上使您可以访问一次一个元素,而切片则使您可以根据需要来回移动(当然,在合理范围内)。

© www.soinside.com 2019 - 2024. All rights reserved.