Если мы начнем с того, откуда взялись Ok
и Err
, мы могли бы получить лучшую идею. Они являются частью перечисления Result
, определенного как:
enum Result<T, E> {
Ok(T),
Err(E),
}
T
и E
являются общими типами. match
сам по себе похож на оператор C switch
, но более гибкий.
Общая форма match
сама по себе:
match value {
pattern => expr,
...
}
Если они совпадают, выражение выполнит оператор рядом с первой рукой, верно?
Да
Но почему num
справа вдруг можно использовать?
Потому что match
соответствует шаблонам слева от =>
в каждой руке. Может распаковывать кортежи, сопоставлять структурные поля, брать части значения и т. Д.
Если я правильно угадал, в чем разница Ok(num)
и Ok(_)
?
_
является шаблоном подстановки и соответствует всему.
Разница между Ok(num)
и Ok(_)
заключается в том, что в первом случае вы спрашиваете, что если Result
является вариантом Ok
, то сохраните его значение типа T
в num
. Во втором случае вы говорите, что вам все равно, какое значение имеет Ok
- до тех пор, пока Result
- это вариант Ok
, который вы хотите выполнить.
Помните, что когда вы используете _
в шаблоне, вы не можете использовать _
внутри кода, т. Е. Это не будет работать, потому что _
не является идентификатором:
let guess: u32 = match guess.trim().parse() {
Ok(_) => _,
Err(_) => continue,
};