在 Rust 中检查字符串是否以数字开头的更简单方法?

Era*_*lon 4 string rust

我目前使用的是这个

fn main() {
    let a = "abc123";
    let b = "1a2b3c";

    println!("{}", a[0..1].chars().all(char::is_numeric));
    println!("{}", b[0..1].chars().all(char::is_numeric));
}
Run Code Online (Sandbox Code Playgroud)

有没有更惯用和/或更简单的方法来做到这一点?

注意:该字符串保证非空且由 ASCII 字符组成。

phi*_*mue 11

如果确定它非空并且由ascii组成,则可以直接对字节(u8)进行操作:

a.as_bytes()[0].is_ascii_digit()
Run Code Online (Sandbox Code Playgroud)

或者

(b'0'..=b'9').contains(&a.as_bytes()[0])
Run Code Online (Sandbox Code Playgroud)

更一般的设置(在我看来,更惯用):

a.chars().next().unwrap().is_numeric()
Run Code Online (Sandbox Code Playgroud)

所有这一切看起来有点笨拙的原因是,可能会出现一些问题(在其他语言中很容易被忽视):

  • 字符串可能为空 => 引导我们进入Option/ unwrap-land
  • rust 中的字符串是 UTF-8(这基本上使字符串的随机访问变得复杂;请注意,rust 不仅0-9 视为数字,如此处所示

  • `a.chars().next().map(char::is_numeric).unwrap_or(false)` 可能有意义 (4认同)
  • 我希望如果你正在测试字符串的*第一个字符*是否是数字,它是解析它的某种先驱 - 在这种情况下`is_digit(10)`(甚至是`is_ascii_digit() `) 可能比 `is_numeric()` 更正确。您可能不希望您的词法分析器将“3/4”归类为“数字”,然后将其交给需要数字的解析器。 (2认同)