2016-03-21 22 views
2

をシャドウイングのエラーRust tutorialが、私はこのコード(ページの最後のスニペット)にこだわっている:私は、私は次のエラーを持っているcargo run実行すると推測ゲーム、私は次のようだ推測バインド

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; 
      } 
     } 
    } 
} 

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() { 
                  ^

正しい構文は何ですか。

+6

'='の後に 'match'を忘れてしまったのです...元のコードと再び比較してください。 –

+1

diffingツールは、その違いを指摘するのに非常に役立ちます。 [オンライン版](https://www.diffchecker.com/)とコマンドライン版があります。 – Shepmaster

+0

@ LukasKalbertodtありがとう!私は今、かなり愚かになった... – rpadovani

答えて

4

構文エラーがあります。問題を解決するために、行の間違った場所に注意を喚起しています。

parseメソッドは値を評価します。この式の後にはブロックを続けるべきではなく、コンパイラによって報告された構文エラーが発生します。

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

あなたは割り当てとparseに呼び出しの間にキーワードmatchを持っているためにリンクされている例。 matchキーワードは式を取り、式の値に基づいて分岐します。ブロックには分岐パターンと式が含まれています。この場合、Resultu32またはu32::Errのいずれかに分解しています。以下

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

明確にするために解析と一致を分離する例です。

// 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

良い説明。しかし、これは解析エラーであり、パーサーは 'parse'の戻り値の型について気にしません。実際、 'guess.trim()。parse()'の式の後にコードブロックを続けてはいけませんが、タイプは関係ありません。たぶんあなたはあなたの答えからその部分を削除することができます... –