一文字ずつ処理したい場合
matches!の場合は、Someと比較する
fn main() { let mut str = "hello world!"; while matches!(str.chars().next(), Some(_x @ ('a'..='z' | 'A'..='Z'))) { let mut chars = str.chars(); chars.next(); str = chars.as_str(); println!("{:?}", str); } }
Running `target/debug/sample`
“ello world!”
“llo world!”
“lo world!”
“o world!”
” world!”
これを応用して、文字列をパースする
fn main() { let source = "123 world"; println!( "source: {}, parsed: {:?}", source, ident(whitespace(number(source))) ); } fn whitespace(mut input: &str) -> &str { while matches!(input.chars().next(), Some(' ')) { let mut chars = input.chars(); chars.next(); input = chars.as_str(); } input } fn ident(mut input: &str) -> &str { if matches!( input.chars().next(), Some(_x @ ('a'..='z' | 'A'..='Z')) ) { while matches!( input.chars().next(), Some(_x @ ('a'..='z' | 'A'..='Z' | '0'..='9')) ) { let mut chars = input.chars(); chars.next(); input = chars.as_str(); } } input } fn number(mut input: &str) -> &str { if matches!( input.chars().next(), Some(_x @ ('-'|'+'|'.'|'0'..='9')) ) { while matches!( input.chars().next(), Some(_x @ ('.'|'0'..='9')) ) { let mut chars = input.chars(); chars.next(); input = chars.as_str(); } } input } #[cfg(test)] mod test { use super::*; #[test] fn test_whitespace() { assert_eq!(whitespace(" "), ""); } #[test] fn test_indent() { assert_eq!(ident("Adam"), ""); } #[test] fn test_number() { assert_eq!(number("123.45 "), " "); } }