Я упростил пример, который возникает при изучении ржавчины на примере — Guards: https://doc.rust-lang.org/rust-by-example/flow_control/match/guard.html
let number: u8 = 4;
match number {
i if i == 0 => println!("Zero"),
}
}
Приведенный выше пример приводит к ошибке компиляции, связанной с тем, что случаи совпадения не являются исчерпывающими. Я не знаю почему. В статье говорится: «Обратите внимание, что компилятор не будет учитывать защитные условия при проверке того, все ли шаблоны охватываются выражением соответствия». Но приведенный ниже пример не приводит к ошибке компиляции:
match number {
i => println!("Zero"),
}
Разница в том, что я снял защиту. Почему это повлияло на вещи, если охрана не должна приниматься во внимание?
См. также главу 6, раздел 2: Совпадения исчерпывающие
В цитируемом вами документе не сказано, что охрана не учитывается, там сказано, что не учитываются условия охраны. Это означает, что следующее не сможет скомпилироваться, даже если будут покрыты все возможные значения для number
:
match number {
i if i >= 0 { 1 },
i if i < 0 { 0 },
}
или даже это:
match number {
i if true => { 0 },
}
Другими словами, тот факт, что на плече спички есть защита, приведет к тому, что это плечо будет полностью проигнорировано при проверке завершения совпадения.
Другими словами, компилятор предполагает, что любая защита совпадения может дать сбой, поскольку в противном случае вы могли бы просто опустить их. Что действительно имеет место в этих двух примерах – в первом вы можете не использовать спичечную защиту на втором плече.
Не уверен, что это только я, не являющийся носителем английского языка, мне было трудно понять это предложение. Мне пришлось перечитать его несколько раз, чтобы понять, что он пытается сказать
The match arm with guard won't be taken into account, when (the compiler) checking if all patterns have been covered.