¿Por qué este patrón de coincidencia es inalcanzable cuando se utilizan patrones no literales?

El siguiente código ( patio de recreo )

let max_column = 7; edge = match current_column { 0 => Edge::Left, max_column => Edge::Right, _ => Edge::NotAnEdge }; 

da como resultado el siguiente error:

 error[E0001]: unreachable pattern --> :10:9 | 10 | _ => Edge::NotAnEdge | ^ this is an unreachable pattern | note: this pattern matches any value --> :9:9 | 9 | max_column => Edge::Right, | ^^^^^^^^^^ 

Reemplazar la variable max_column con el literal funciona bien:

 let max_column = 7; edge = match current_column { 0 => Edge::Left, 7 => Edge::Right, _ => Edge::NotAnEdge }; 

¿Por qué _ es inalcanzable en el primer ejemplo cuando se puede alcanzar para cualquier valor donde current_column != max_column ?

En su ejemplo, max_column es el nombre de la variable a la que se vinculará, no una constante o una variable externa. Quieres un guarda partido :

 let current_column = 1; let max_column = 7; edge = match current_column { 0 => Edge::Left, a if a == max_column => Edge::Right, _ => Edge::NotAnEdge }; 

Tenga en cuenta que a y _ son realmente lo mismo! En ambos casos, la variable coincidente se vinculará con un nombre ( a o _ respectivamente), pero cualquier identificador con el prefijo _ tiene un carácter especial para ser utilizado como un marcador de posición variable no utilizado (ver la aclaración / corrección de bluss ).