Как охранники влияют на ход матча?

Я упростил пример, который возникает при изучении ржавчины на примере — 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"),
}

Разница в том, что я снял защиту. Почему это повлияло на вещи, если охрана не должна приниматься во внимание?

Не уверен, что это только я, не являющийся носителем английского языка, мне было трудно понять это предложение. Мне пришлось перечитать его несколько раз, чтобы понять, что он пытается сказать The match arm with guard won't be taken into account, when (the compiler) checking if all patterns have been covered.

halfelf 21.11.2022 09:08

См. также главу 6, раздел 2: Совпадения исчерпывающие

E_net4 the idiot downvoter 21.11.2022 10:08
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
3
2
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В цитируемом вами документе не сказано, что охрана не учитывается, там сказано, что не учитываются условия охраны. Это означает, что следующее не сможет скомпилироваться, даже если будут покрыты все возможные значения для number:

match number {
    i if i >= 0 { 1 },
    i if i < 0  { 0 },
}

или даже это:

match number {
    i if true => { 0 },
}

Другими словами, тот факт, что на плече спички есть защита, приведет к тому, что это плечо будет полностью проигнорировано при проверке завершения совпадения.

Другими словами, компилятор предполагает, что любая защита совпадения может дать сбой, поскольку в противном случае вы могли бы просто опустить их. Что действительно имеет место в этих двух примерах – в первом вы можете не использовать спичечную защиту на втором плече.

Sven Marnach 21.11.2022 11:35

Другие вопросы по теме