Как сопоставить векторный элемент в Rust? - PullRequest
0 голосов
/ 15 января 2019

В Rust сопоставление с таким значением работает.

let x = 1;

match x {
    1 => println!("one"),
    2 => println!("two"),
    _ => println!("something else")
}

Но использование значений из вектора вместо жестко закодированных чисел в match не работает.

let x = 1;
let list = vec![1, 2];

match x {
    list[0] => println!("one"),
    list[1] => println!("two"),
    _ => println!("something else")
}

Это не с сообщением:

error: expected one of `=>`, `@`, `if`, or `|`, found `[`
 --> src/main.rs:6:9
  |
6 |     list[0] => println!("one"),
  |         ^ expected one of `=>`, `@`, `if`, or `|` here

Почему это не работает?

1 Ответ

0 голосов
/ 15 января 2019

Паттерн спичечного рукава определен как

Syntax
Pattern :
     LiteralPattern
   | IdentifierPattern
   | WildcardPattern
   | RangePattern
   | ReferencePattern
   | StructPattern
   | TupleStructPattern
   | TuplePattern
   | GroupedPattern
   | SlicePattern
   | PathPattern
   | MacroInvocation

Он либо постоянный (включая буквальный), либо структурный, а не вычисляемый. Значение, определенное как list[0], не соответствует ни одному из этих определений.

К счастью, спичечная рука может также содержать охранное выражение , которое допускает это:

let x = 1;
let list = vec![1, 2];

match x {
    _ if x == list[0] => println!("one"),
    _ if x == list[1] => println!("two"),
    _ => println!("something else")
}

Использование if else было бы более чистым, хотя (или другой структурой, если у вас есть больше случаев, таких как карта или индекс).

...