Input 在使用打印的示例中,简化是可能的!和同花顺?
几天前,我通过查阅官方文档开始编写Rust。现在,我试图通过阅读实用程序员Brian P.Hogan的《程序员练习》一书来挑战我对生锈的理解 第一个练习是编写一个程序,要求用户输入一个名称,并使用该名称打印出问候语。输入、字符串连接和输出应分为三个不同的步骤 你的名字叫什么?帕特里克 你好,帕特里克,很高兴认识你。 将在初始提示的同一行输入名称。以下是我的解决方案: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
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示例:使用名称长度的上限可能会缩短。连接必须是这项工作的一个独特步骤,否则它当然会更短。