2 Pregunta: ¿Por qué puedes usar un nombre no declarado previamente en una coincidencia?

pregunta creada en Thu, Mar 28, 2019 12:00 AM

Estoy experimentando un problema al entender este código del segundo capítulo del libro:

let guess: u32 = match guess.trim().parse() {
    Ok(num) => num,
    Err(_) => continue,
};

Mi problema es con Ok(num) => num: parse() devuelve un valor (0600350991111001010506 o Ok) devuelve un valor (0600350991111101035062 o Err), 060035099111110101031062 compara este valor devuelto al primer brazo. Si coinciden, la expresión ejecutará la instrucción al lado del primer brazo, ¿verdad?

En match, Ok(num) parece haber aparecido repentinamente, ya que no había ninguna declaración de num en el código anterior. Lo mismo con la declaración, num: => num estaba de repente en el alcance. Así que

  1. Si supongo que la derecha, num coincide con el valor devuelto con match, a continuación, asigna cualquier número que sea (dentro Ok()) a Ok. Pero por qué es num a la derecha de repente utilizable?
  2. Si he acertado, ¿cuál es la diferencia entre num y Ok(num)?
4
  1. Para una mejor comprensión, debe seguir leyendo el libro, a saber, capítulo 6 donde se explicarán los enumerados y la coincidencia de patrones.
    2019-03-29 07: 07: 36Z
  2. El Ok(_) en el patrón es la declaración.
    2019-03-29 09: 01: 43Z
2 Respuestas                              2                         

Si comenzamos con el origen de num y Ok, podríamos tener una mejor idea. Son parte del Err enumeración definida como:

Result

enum Result<T, E> {
   Ok(T),
   Err(E),
}
y T son tipos genéricos. E en sí es como la declaración match de C pero más flexible.

La forma general de switch es:

match
  

Si coinciden, la expresión ejecutará la instrucción al lado del primer brazo, ¿no?

  

Pero, ¿por qué se puede utilizar de repente

match value {
    pattern => expr,
    ...
}
a la derecha?

Porque num hace coincidir patrones a la izquierda del match en cada brazo. Puede descomprimir las tuplas, hacer coincidir los campos de la estructura, tomar prestadas partes de un valor, etc.

  

Si he acertado, ¿cuál es la diferencia entre => y Ok(num)?

Ok(_) es un patrón de comodín y coincide con todo.

La diferencia entre _ y Ok(num) es que, en el primer caso, está preguntando que si la 0600350991111001010506 es la carga de la clase de la carga de la carga de la carga de la carga de la carga del tipo de juego, la carga de la licencia de la licencia de la licencia de la licencia de la licencia de la licencia de la licencia de la licencia de la licencia de la licencia de la licencia de la licencia del tipo 0600350 Ok(_) se mantiene, siempre que la Result sea la Ok variante que desea ejecutar.

Recuerde que cuando usa T en un patrón, no puede usar num dentro del código, es decir, esto no funcionará porque Ok no es un identificador:

Result     
9
2019-03-30 13: 48: 26Z

respuesta corta. Ok puede destruir estructuras, enumeraciones ... vea aquí

la firma de _ es _. Hay un tipo genérico _ en él.

El compilador encuentra

let guess: u32 = match guess.trim().parse() {
    Ok(_) => _,
    Err(_) => continue,
};
, e infiere que lo que necesitas es patterns match. Así que el parse es pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> aquí.

Luego, los patrones coinciden con los extractos destructores F del let guess: u32 =

    
0
2019-03-29 03: 05: 07Z
  1. Si responde una pregunta, intente responderla a todas (aunque solo debería ser una pregunta a la vez, pero esta vez no es el caso).
    2019-03-29 07: 12: 50Z
    u32
fuente colocada aquí