gpt4 book ai didi

string - mut循环内的字符串重新声明

转载 作者:行者123 更新时间:2023-12-03 11:36:16 25 4
gpt4 key购买 nike

我正在阅读Rust书,猜谜游戏教程包含以下代码:

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

fn main() {
let secret_number = rand::thread_rng().gen_range(1, 101);
let mut input = String::new();

loop {
print!("Guess the number I'm thinking of: ");
io::stdout().flush().unwrap();
io::stdin().read_line(&mut input).expect("Failed to read line");

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

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

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

首次用户输入后,此代码失败。如果我在循环内移动 let mut input = String::new();声明,那么一切都很好...但是我想知道为什么我必须这样做,因为 input的地址已传递到 read_line()中?
还有一件事,为什么我必须使用 std::io::Write才能使用 io::stdout().flush().unwrap();,因为我已经在使用 use std::io;了?

最佳答案

io::stdin().read_line(&mut input);
此方法不会覆盖 String ,但会附加到 String。这就是为什么仅循环的第一个迭代起作用,但是在第二个迭代中它立即中断的原因。如果要在两次迭代之间重用 String缓冲区,则需要截断它,然后再将其传递回 read_line 。固定的工作示例:
use rand::Rng;
use std::cmp::Ordering;
use std::io;
use std::io::Write;

fn main() {
let secret_number = rand::thread_rng().gen_range(1, 101);
let mut input = String::new();

loop {
print!("Guess the number I'm thinking of:");
io::stdout().flush().unwrap();

input.clear(); // truncate String buffer here!

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

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

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

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

And one more thing why do I have to use std::io::Write in order to use io::stdout().flush().unwrap(); since I'm already using use std::io;?


为了调用特征方法,您需要将特征纳入范围。 flush Write 特性定义。

关于string - mut循环内的字符串重新声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65865824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com