如果条件匹配则替换

时间:2020-07-21 09:52:35

标签: rust match

我正在尝试改善对match表达式的使用。

我有如下代码,其中foo是一个字符串:

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

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

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

1 个答案:

答案 0 :(得分:5)

您的方法存在几个问题:

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

有一个proposal to make | a regular pattern而不是match的特殊构造,它将使第一个分支可表示为&[2 | 3, ..]

相关问题