rust - 如何在 Rust 中将 read_line() 的结果作为字符串获取?
问题描述
我正在尝试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);
}
但是从usize
to的转换String
似乎将内容更改为它的长度:
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
解决方案
请参阅文档,您可以看到它会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;
}
或者,更惯用的是,在提供无效输入时不要惊慌:
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),
}
}
在这个变体中,调用者是决定如何处理错误的人。
推荐阅读
- docker - Dockerfile 中的 ADD 关键字有什么用?
- linux - SEBool 持久值
- java - 我可以在关机时进行 Swing 操作吗?
- c# - 如何修复 Excel 中不正确的日期和时间值?
- scala - 在 Playframework 启动之前启动测试容器
- sql - 计算每月关闭或为空的帐户数量
- java - RxJava 2 Flowable forEach() 与 subscribe()
- javascript - React Redux - 使用功能组件与 useDispatch 与类组件和 mapStateToProps 的混淆
- .htaccess - 单页的 Htaccess 重定向不起作用
- enums - 数据包字段枚举为字符串