2016-08-17 17 views
2

我正在使用Rust中的Java教科書重寫平均計算器。它使用一個循環來詢問幾個輸入,但我認爲我遇到了所有權問題(因爲循環內有一個let grade),所以我試圖更好地理解。試圖從循環外部借用變量綁定

當我在循環外部聲明grade時,只記錄第一個輸入值:無論輸入如何,隨後的每個grade值都將變爲0。如果我在循環內聲明grade,則每個輸入值都會被正確記錄。

有沒有一種方法可以讓我借用外部循環聲明grade,還有這個小程序的工作?

use std::io; 

fn main() { 
    let mut total: u32 = 0; 
    let mut count: u32 = 0; 
    let mut grade = String::new(); //This one 

    while count < 5 { 
     println!("Enter number:"); 

     io::stdin().read_line(&mut grade) 
      .expect("failed."); 

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

     total = total + grade; 
     count = count + 1; 
    } 
    println!("Tot: {}\nAvg: {}", total, total as f64/count as f64); 
} 

回答

6

read_line追加給你讀入的字符串,因此,如果您輸入1,然後2,grade將包含1\n2或諸如此類的話。這不能被解析爲一個整數,所以下面的匹配將始終返回0.解決方法是在讀取之前清空字符串:grade.clear();

+1

這解決了問題,並教會了我一些關於read_line的內容。頂尖! – pithonsmear