用匹配替换条件

Mau*_*uro 0 match rust

我正在努力改进我的match表达方式。

我有一个类似下面的代码,其中foo是一个字符串:

if foo.chars().nth(0).unwrap() != '2' && 
    foo.chars().nth(0).unwrap() != '3' &&
    &foo[0..3] != "xyz"
    {
        return message;
    }
Run Code Online (Sandbox Code Playgroud)

是否可以使用匹配来创建相同的行为?像这样的想法:

match foo {
   &[0] == (2 | 3) => do_nothing
   &[0..3] == "xyz" => do_nothing
   _ => return message;
}
Run Code Online (Sandbox Code Playgroud)

mca*_*ton 5

你的方法有几个问题:

  1. 匹配的表达式必须是唯一的。您无法foo[0]在某些分支和foo[0..3]其他分支中匹配。所以让我们选择最大的范围:foo[0..3].
  2. Rust 字符串匹配不能匹配子字符串:要么全有要么全无。切片没有这个限制,我们可以自由地获取一个字节切片,所以让我们匹配&foo.as_bytes()[0..3].
match &foo.as_bytes()[0..3] {
    &[b'2', ..] | &[b'3', ..] => do_nothing(),
    b"xyz" => do_nothing(),
    _ => return message,
}
Run Code Online (Sandbox Code Playgroud)

有一个建议是创建|一个常规模式而不是 的特殊构造match,这将使第一个分支可以表示为&[2 | 3, ..]