如何在Rust中将read_line()的结果作为String?

Die*_*oAV -1 tostring rust

我正试图String从标准输入中获取:

use std::io;

fn ask_nick() -> String {
    let reader = io::stdin();
    let mut buffer: String = String::new();

    let nickname: String = reader.read_line(&mut buffer).ok()
        .expect("ERRMSG").to_string();

        println!("OK: Hello {}!", &nickname);
        return nickname;
    }
}

fn main() {
    let nickname: String = ask_nick();
    println!("{}", nickname);
}
Run Code Online (Sandbox Code Playgroud)

但是,从转换usizeString仿佛内容改变它的长度:

          INPUT:= John
EXPECTED OUTPUT:= OK: Hello John!
                  John
         OUTPUT:= OK: Hello 5!
                  5

          INPUT:= Doe
EXPECTED OUTPUT:= OK: Hello Doe!
                  Doe
         OUTPUT:= OK: Hello 4!
                  4
Run Code Online (Sandbox Code Playgroud)

Kro*_*tan 6

请参阅文档,您可以看到它read_line 改变了其参数的内容(在您的情况下,绑定的空字符串buffer),将值读入其中,并返回读取的长度.但是你要打开那个结果并将长度转换为字符串.

相反,您的功能应如下所示:

fn ask_nick() -> String {
    let reader = io::stdin();
    let mut buffer: String = String::new();

    reader.read_line(&mut buffer)
        .ok()
        .expect("ERRMSG");

    println!("OK: Hello {}!", buffer);
    return buffer;
}
Run Code Online (Sandbox Code Playgroud)

或者,更具惯用性,在提供无效输入时不会恐慌:

fn ask_nick() -> Result<String> {
    let reader = io::stdin();
    let mut buffer: String = String::new();

    match reader.read_line(&mut buffer) {
        Ok(_) => Ok(buffer),
        Err(e) => Err(e),
    }
}
Run Code Online (Sandbox Code Playgroud)

在此变体中,调用者是决定如何处理错误的调用者.

  • 我认为你可以用`reader.read_line(&mut buffer).map(| _ | buffer)来替换最后一个匹配,如果你想真的很简洁:)除非有一些奇怪的闭包移动语义我还没有占了,就是! (2认同)