gpt4 book ai didi

rust - 为什么 rust 的 read_line 函数使用可变引用而不是返回值?

转载 作者:行者123 更新时间:2023-12-03 11:24:09 24 4
gpt4 key购买 nike

考虑这段代码来读取 rust 中的用户输入

use std::io;
fn main() {
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("error: unable to read user input");
println!("{}", input);
}
为什么没有办法这样做?
use std::io;
fn main() {
let mut input = io::stdin()
.read_line()
.expect("error: unable to read user input");
println!("{}", input);
}
其他语言会更方便

最佳答案

TL;DR 你最接近的是 lines() ,以及原因 read_line像它一样工作就是效率。使用的版本lines()看起来像这样:

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

fn main() {
// get next line from stdin and print it
let input = io::stdin().lock().lines().next().unwrap().expect("IO error");
println!("{}", input);
}
一般来说, read_line()并非设计用于小型交互式程序;有 better ways来实现那些。
read_line 方法来自泛型 io::BufRead trait,它的主要用途是读取输入,通常从文件或其他程序重定向,并且可能大量输入。在处理大量数据时,尽量减少执行的分配次数是有利的,这就是为什么 read_line旨在重用现有字符串。一个典型的模式是:
let mut line = String::new();
while input.read_line(&mut line)? != 0 {
// do something with line
...
line.clear();
}
(重新)分配的数量保持最少,如 line将仅根据需要增长以适应输入线。一旦达到典型大小,分配将变得非常罕见,一旦读取到最大行,它们将完全消失。如 read_line()支持“方便”的界面,那么上面的循环确实会更好看——例如:
while let Some(line) = read_new_line(some_input)? {
// process the line
...
}
...但需要对每一行进行新的分配和解除分配。在一次性或学习程序中,这可能完全没问题,但是 BufRead旨在作为高效 IO 的构建块,因此其 read_line方法有利于性能而不是方便。

关于rust - 为什么 rust 的 read_line 函数使用可变引用而不是返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63627687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com