我在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);
}
答案 0 :(得分:6)
read_line
将附加到您正在阅读的字符串中,因此如果您输入1然后输入2,grade
将包含1\n2
或其他内容为此。这不能解析为整数,因此下面的匹配将始终返回0.解决方案是在读取之前清空字符串:grade.clear();