2016-08-17 14 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