我在一些基本的I/O方面遇到了一些问题.具体来说,文本"请输入您的姓名"将写入输出after,我输入我的姓名并点击输入:

use std::io;

fn main() {
    print!("Please enter your name: ");

    let mut name = String::new();
    match io::stdin().read_line(&mut name) {
        Ok(_) => println!(""),
        Err(err) => println!("Could not parse input: {}", err)
    }

    println!("Hello, {}!", name.trim());
}

给出以下输出:

Compiling chat v0.1.0 (file:///home/marcus/dev/rust/chat)
  Running `target/debug/chat`
marcus
Please enter your name: 
Hello, marcus!

第一个"马库斯"是我输入的.为什么程序在等待输入之前不打印"请输入您的姓名"?


如果返回的ResultOk,是否可能"什么都不做"?在本例中,Ok()表示我已将输入保存在变量名中.太好了.但在这种情况下,我该怎么处理Ok() =>呢?

推荐答案

为什么程序在等待输入之前不打印"请输入您的姓名"?

嗯,是did.只是出于性能原因,标准输出是缓冲的.写操作完成了,但它只是在写内存.如果你想让它真正显示给用户,你必须触发刷新.这可以通过写一个换行符来实现,也可以通过显式实现:

io::Write::flush(&mut io::stdout()).expect("flush failed!");

// If you "use" `io::Write`...
io::stdout().flush().expect("flush failed!");

此外,如果返回的结果正常,是否可以"不做任何事情"?

当然只是什么都不做.

match io::stdin().read_line(&mut name) {
    Ok(_) => { /* nothing */ },
    Err(err) => println!("Could not parse input: {}", err)
}    

这里的相关要求是,match中的所有武器必须具有相同的结果类型.在println!的情况下,结果是();除了空块(或另一个返回()的函数)之外,您可以只使用一个文本:

match io::stdin().read_line(&mut name) {
    Ok(_) => (),
    Err(err) => println!("Could not parse input: {}", err)
}

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

是否有可能同时避免不兼容的不透明类型和代码重复?

为什么我不能从带有字符串的 struct 的引用迭代器中收集VEC<;&;str&>?

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

integer cast as pointer是什么意思

如何使用盒装枚举进行模式匹配?

Gtk4-rs:将监视器作为gdk::monitor获取,而不是作为glib::对象获取

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

Rust 如何将链表推到前面?

为什么 Rust 字符串没有短字符串优化 (SSO)?

Rust 函数指针似乎被borrow 判断器视为有状态的

Rust 引用元组和引用元组

n 个范围的笛卡尔积

将 (T, ()) 转换为 T 安全吗?

编写 TOML 文件以反序列化为 struct 中的枚举

相互调用的递归异步函数:检测到循环