背景:Rust 有match构造,这对于制作(可能)详尽的案例及其相应结果列表非常有用。问题是:如何创建一个包含许多案例子集的案例?
关于我的具体问题,我正在制作一个词法分析器,它逐个字符地读取字符串并吐出标记。它的主要功能如下所示:
\n(...)\n fn new(input: &str) -> Lexer {\n let mut characters = input.chars();\n for c in characters {\n let mut token: Option<Token> = match c {\n \'+\' => Some(Token::Add),\n \'-\' => Some(Token::Minus),\n \'*\' => Some(Token::Mul),\n \'/\' => Some(Token::Div),\n \'e\' => Some(Token::EulersNum),\n \'\xcf\x80\' => Some(Token::Pi),\n \'(\' => Some(Token::LeftParen),\n \')\' => Some(Token::RightParen),\n \' \' | \'\\t\' | \'\\n\' => continue, //Whitespace\n _ => None\n };\n\n if token == None {\n continue;\n }\n }\n\n todo!()\n }\n(...)\nRun Code Online (Sandbox Code Playgroud)\n现在,就这个问题而言,最重要的部分是用“空白”注释的部分。我处理空格的问题是它可能与给定字符串格式中空格的实际实现不对应。当然,我可以处理所有不同类型的 ascii 空格,但是 Unicode 呢?制作详尽的空格列表不仅很麻烦,而且还会混淆代码。它应该留给语言,而不是它的用户。
\n是否可以将其与“空白”表达式匹配,例如:
\n(...)\n\nWhitespace => continue,\n\n(...)\nRun Code Online (Sandbox Code Playgroud)\n如果是这样,我该怎么做?
\nchar::is_whitespace()你可以在比赛后卫中使用:
match c {
'+' => Some(Token::Add),
'-' => Some(Token::Minus),
'*' => Some(Token::Mul),
'/' => Some(Token::Div),
c if c.is_whitespace() => Some(Token::Whitespace),
_ => None,
};
Run Code Online (Sandbox Code Playgroud)