【问题标题】:How to continue iterating the next char in a for each loop in rust如何在rust中的每个循环中继续迭代下一个字符
【发布时间】:2020-04-22 17:49:40
【问题描述】:

我正在编写一个简单的分词器,它将从它的新函数中获取输入(希望将其删除以支持 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 如何让我继续迭代直到满足条件。有没有办法调用序列中的下一个字符?

另外,如果您在我所采取的方向方面发现此代码有任何问题,请告诉我。谢谢。

这是rust playground的链接。

【问题讨论】:

标签: loops rust token lex


【解决方案1】:

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

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

  • skip_while 可以跳过开头满足某个谓词的元素
  • peekable 创建一个能够向前看的迭代器

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

【讨论】:

  • 谢谢你。但是你能解释一下你所说的使用切片是什么意思吗?为什么?
  • @Zana 不是遍历字符串,而是编写一个循环(例如while !source.is_empty() {}),通过slicing it 从字符串中删除标记。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 2016-06-25
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2015-08-27
相关资源
最近更新 更多