Rust println!结果和打印的不一样!当使用time::sleep [duplicate]时

9nvpjoqh  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(140)

此问题已在此处有答案

Why does this read input before printing?(3个答案)
20天前关闭。
好吧,所以我没有与Rust合作那么久,所以如果这是愚蠢的,我很抱歉。但我想做一个print函数,它接收一个字符串,然后在同一行上逐个字符地打印字符串,每个字符之间有一个停顿。函数如下:

fn talk(input: String){
    let inputVec: Vec<char> = input.chars().collect();
    
    let mut i = 0;
    loop{
        thread::sleep(time::Duration::from_millis(100));
        if i >= inputVec.len() {
            break;
        }
        print!("{}", inputVec[i]);
        i = i + 1;
    }
}

当我用这个打印代码的时候!宏,它不工作,只是等待100毫秒,然后打印字符串作为一个打印!调用。但是如果我使用println!那么它就完美地工作了,减去每个字符的新行。有人能帮我吗?或者至少告诉我为什么它不工作?

f0brbegy

f0brbegy1#

就像Vivick和drewlett的注解一样,你需要使用Write io的模块Trait的flush。

use std::{thread, time};
use std::io::{self, Write};

fn main() {
    talk("Hello, world!\n".to_string());
}

fn talk (input: String) {
    let chars = Vec::<u8>::from(input);
    let mut i = 0;
    while i < chars.len() {
        print!("{}", chars[i] as char);
        io::stdout().flush().unwrap();
        thread::sleep(time::Duration::from_millis(100));
        i+=1;
    }
}

这对我很有效!
但是,最简单的方法是使用eprint!宏,如下所示:

use std::{thread, time};

fn main() {
    talk("Hello, world!\n".to_string());
}

fn talk (input: String) {
    let chars = Vec::<u8>::from(input);
    let mut i = 0;
    while i < chars.len() {
        eprint!("{}", chars[i] as char);
        thread::sleep(time::Duration::from_millis(100));
        i+=1;
    }
}

documentation说:
eprint!仅用于错误和进度消息。使用print!作为程序的主输出。

相关问题