Input 在使用打印的示例中,简化是可能的!和同花顺?

Input 在使用打印的示例中,简化是可能的!和同花顺?,input,rust,output,flush,Input,Rust,Output,Flush,几天前,我通过查阅官方文档开始编写Rust。现在,我试图通过阅读实用程序员Brian P.Hogan的《程序员练习》一书来挑战我对生锈的理解 第一个练习是编写一个程序,要求用户输入一个名称,并使用该名称打印出问候语。输入、字符串连接和输出应分为三个不同的步骤 你的名字叫什么?帕特里克 你好,帕特里克,很高兴认识你。 将在初始提示的同一行输入名称。以下是我的解决方案: use std::io; use std::io::Write; fn main() { print!("What is

几天前,我通过查阅官方文档开始编写Rust。现在,我试图通过阅读实用程序员Brian P.Hogan的《程序员练习》一书来挑战我对生锈的理解

第一个练习是编写一个程序,要求用户输入一个名称,并使用该名称打印出问候语。输入、字符串连接和输出应分为三个不同的步骤

你的名字叫什么?帕特里克 你好,帕特里克,很高兴认识你。 将在初始提示的同一行输入名称。以下是我的解决方案:

use std::io;
use std::io::Write;

fn main() {
    print!("What is your name? ");
    match io::stdout().flush() {
        Ok(_) => print!(""),
        Err(error) => println!("{}", error),
    }
    let mut name = String::new();
    match io::stdin().read_line(&mut name) {
        Ok(_) => {
            name = name.trim().to_string();
            if name.len() > 0 {
                let greeting = "Hello, ".to_string() + &name + &", nice to meet you!".to_string();
                println!("{}", greeting);
            } else {
                println!("No name entered, goodbye.");
            }
        }
        Err(error) => println!("{}", error),
    }
}
印刷品!在调用flush之前,宏实际上不会输出提示。flush需要错误处理,所以我需要处理Ok和Err两种情况。在Ok的情况下,没有什么有用的事情要做,所以我只是打印!空字符串


有没有较短的处理方法?也许可以跳过或简化错误处理,或者简化整个打印/冲洗法是错误的。一切都很好,但我可以用C写得更短,毕竟…

正如其他人所说,请务必阅读

在大多数情况下,您不想使用println!报告错误。要么从函数返回错误并让调用方处理,要么使用panic!中止该线程并可能中止该进程

match io::stdout().flush() {
    Ok(_) => print!(""),
    Err(error) => println!("{}", error),
}
你可以不打印效率低下的东西,而只是。。。什么也不做:

match io::stdout().flush() {
    Ok(_) => (),
    Err(error) => println!("{}", error),
}
由于您不关心成功案例,因此可以使用if-let:

用恐慌代替println!更好的办法是:

if let Err(error) = io::stdout().flush() {
    panic!("{}", error);
}
这几乎就是它的作用,只是它在出现时也会返回successful值:

pub fn unwrap(self) -> T {
    match self {
        Some(val) => val,
        None => panic!("called `Option::unwrap()` on a `None` value"),
    }
}
但是,最好使用它,它允许您指定额外的错误消息:

io::stdout().flush().expect("Unable to flush stdout");
应用这两次:

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

fn main() {
    print!("What is your name? ");

    io::stdout().flush().expect("Unable to flush stdout");

    let mut name = String::new();
    io::stdin()
        .read_line(&mut name)
        .expect("Unable to read the line");

    let name = name.trim();

    if !name.is_empty() {
        println!("Hello, {}, nice to meet you!", name);
    } else {
        println!("No name entered, goodbye.");
    }
}
请注意,不需要重新分配字符串,您可以对名称进行阴影处理,也不需要仅使用格式来打印内容

由于Rust 1.26.0,您还可以选择从main返回结果:

但我可以用C写得更短,毕竟


我鼓励/挑战你尝试这样做。请注意,此程序中的每个内存分配都会被检查,处理标准输出的每个故障情况也是如此。许多人不知道C的printf返回一个您应该检查的错误代码。例如,尝试输出到已关闭的管道。

正如其他人所说,请务必阅读

在大多数情况下,您不想使用println!报告错误。要么从函数返回错误并让调用方处理,要么使用panic!中止该线程并可能中止该进程

match io::stdout().flush() {
    Ok(_) => print!(""),
    Err(error) => println!("{}", error),
}
你可以不打印效率低下的东西,而只是。。。什么也不做:

match io::stdout().flush() {
    Ok(_) => (),
    Err(error) => println!("{}", error),
}
由于您不关心成功案例,因此可以使用if-let:

用恐慌代替println!更好的办法是:

if let Err(error) = io::stdout().flush() {
    panic!("{}", error);
}
这几乎就是它的作用,只是它在出现时也会返回successful值:

pub fn unwrap(self) -> T {
    match self {
        Some(val) => val,
        None => panic!("called `Option::unwrap()` on a `None` value"),
    }
}
但是,最好使用它,它允许您指定额外的错误消息:

io::stdout().flush().expect("Unable to flush stdout");
应用这两次:

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

fn main() {
    print!("What is your name? ");

    io::stdout().flush().expect("Unable to flush stdout");

    let mut name = String::new();
    io::stdin()
        .read_line(&mut name)
        .expect("Unable to read the line");

    let name = name.trim();

    if !name.is_empty() {
        println!("Hello, {}, nice to meet you!", name);
    } else {
        println!("No name entered, goodbye.");
    }
}
请注意,不需要重新分配字符串,您可以对名称进行阴影处理,也不需要仅使用格式来打印内容

由于Rust 1.26.0,您还可以选择从main返回结果:

但我可以用C写得更短,毕竟


我鼓励/挑战你尝试这样做。请注意,此程序中的每个内存分配都会被检查,处理标准输出的每个故障情况也是如此。许多人不知道C的printf返回一个您应该检查的错误代码。例如,尝试输出到已关闭的管道。

为什么不直接调用unwrap,如:io::stdout.flush.unwrap?有了像flush这样几乎永远不会失败的东西,这就足够了。好吧,谢谢!这很有效。我只是还不明白,为什么。我把这本书读到了第4.12章,但“展开”只在第章中处理。我建议阅读错误处理部分。它详细介绍了“展开”的作用,以及简化错误处理的其他选项。OK。生锈似乎是一个很难解决的问题。即使是一个高级hello world示例也需要对错误处理机制有深入的了解-为什么不直接调用unwrap,就像这样:io::stdout.flush.unwrap?有了像flush这样几乎永远不会失败的东西,这就足够了。好吧,谢谢!这很有效。我只是还不明白,为什么。我把这本书读到了第4.12章,但“展开”只在第章中处理。我建议阅读错误处理部分。它详细介绍了“展开”的作用,以及简化错误处理的其他选项。OK。生锈似乎是一个很难解决的问题。即使是一个高级hello world示例也需要对错误handlin有深入的了解
g机制-非常感谢您指出所有不同的选择。空块可能是我最初寻找的,而不是打印空字符串。但其他选择甚至更好。在我开始练习之前,我真的需要先看完整本介绍书。锈有一个陡峭的学习曲线。谈论C示例:使用名称长度的上限可能会缩短。对于这个练习来说,连接必须是一个独特的步骤,否则它当然会更短。非常感谢您指出所有不同的选项。空块可能是我最初寻找的,而不是打印空字符串。但其他选择甚至更好。在我开始练习之前,我真的需要先看完整本介绍书。锈有一个陡峭的学习曲线。谈论C示例:使用名称长度的上限可能会缩短。连接必须是这项工作的一个独特步骤,否则它当然会更短。