2016-03-21 10 views
2

Ich folge der Rust tutorial aber ich bin auf diesem Code (das letzte Schnipsel in der Seite) stecken:Erraten Spiel, Fehler auf Shadowing Vermutung binden

extern crate rand; 

use std::io; 
use std::cmp::Ordering; 
use rand::Rng; 

fn main() { 
    println!("Guess the number!"); 

    let secret_number = rand::thread_rng().gen_range(1, 101); 

    println!("The secret number is {}", secret_number); 

    loop { 
     println!("Please input your guess"); 

     let mut guess = String::new(); 

     io::stdin() 
      .read_line(&mut guess) 
      .expect("Failed to read line"); 

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

     println!("You guessed: {}", guess); 

     match guess.cmp(&secret_number) { 
      Ordering::Less  => println!("Too small!"), 
      Ordering::Greater => println!("Too big!"), 
      Ordering::Equal  => { 
       println!("You win!"); 
       break; 
      } 
     } 
    } 
} 

Wenn ich laufen cargo run ich folgende Fehlermeldung haben :

src/main.rs:23:47: 23:48 error: expected one of `.`, `;`, or an operator, found `{` 
src/main.rs:23   let guess: u32 = guess.trim().parse() { 
                  ^

Was ist die richtige Syntax?

+6

Sie haben das 'match' nach der' = 'Zuweisung vergessen ... Vergleichen Sie es wieder mit dem ursprünglichen Code. –

+1

Ein Diffing-Tool wäre von unschätzbarem Wert, um auf die Unterschiede hinzuweisen. Es gibt [Online-Versionen] (https://www.diffchecker.com/) und Kommandozeilen-Versionen. – Shepmaster

+0

@LukasKalbertodt danke! Ich bin ziemlich dumm im Moment gefallen ... – rpadovani

Antwort

4

Es liegt ein Syntaxfehler vor, und die Compilernachricht weist Ihre Aufmerksamkeit auf die falsche Stelle in der Zeile, um das Problem zu beheben.

Die Methode parse wertet einen Wert aus. Auf diesen Ausdruck sollte kein Block folgen, der den vom Compiler gemeldeten Syntaxfehler verursacht.

https://doc.rust-lang.org/std/string/struct.String.html#method.parse

Das Beispiel Sie verknüpft hat das Schlüsselwort match zwischen der Zuordnung und rufen zu parse. Das Schlüsselwort match nimmt einen Ausdruck an und verzweigt basierend auf dem Wert des Ausdrucks. Der Block enthält die Verzweigungsmuster und Ausdrücke. In diesem Fall wird auch die Result zu entweder u32 oder u32::Err destrukturiert.

https://doc.rust-lang.org/book/match.html

Unten ist ein Beispiel, das die Parse und Spiel für Klarheit trennt.

// Store result of parsing in a variable 
let parse_result = guess.trim().parse(); 
// Destructure the result 
let guess: u32 = match parse_result { 
    // If parse succeeded evaluate to the number 
    Ok(num) => num, 
    // If parse failed repeat the loop 
    Err(_) => continue, 
}; 
+0

Schöne Erklärung. Dies ist jedoch ein Parsing-Fehler und der Parser kümmert sich nicht um den Rückgabetyp von 'parse'. In der Tat darf dem Ausdruck "guess.trim(). Parse()" kein Codeblock folgen, aber der Typ spielt keine Rolle. Vielleicht könnten Sie diesen Teil aus Ihrer Antwort entfernen ... –

Verwandte Themen