gpt4 book ai didi

rust - 使用 to_string 是按行读取文件并按空格拆分的最干净的方法吗?

转载 作者:行者123 更新时间:2023-11-29 08:15:17 26 4
gpt4 key购买 nike

我正在尝试读取格式如下的文件:

ruby 2.6.2
elixir 1.8.3

然后像这样伪代码转换成二维数组:

[
["ruby", "2.6.2"]
["elixir", "1.8.3"]
]

我必须在 Rust 中执行此操作的代码是:

use std::fs::File;
use std::io::prelude::*;
use std::io::{self, BufReader};

use std::path::Path;

pub fn present() -> bool {
path().exists()
}

pub fn parse() -> Vec<Vec<String>> {
let f = BufReader::new(file().unwrap());
f.lines()
.map(|line| {
line.unwrap()
.split_whitespace()
.map(|x| x.to_string())
.collect()
})
.collect()
}

fn file() -> io::Result<File> {
let f = File::open(path())?;
return Ok(f);
}

fn path<'a>() -> &'a Path {
return Path::new(".tool-versions");
}

我在这里不确定的是 parse 函数中间的这一行:

.map(|x| x.to_string())

这似乎有点“过劳”,但我不确定我的感觉是否正确。

我在这里遗漏了什么,或者这是编写此代码以完成此特定任务的最干净的方法吗?

最佳答案

您的代码通常是惯用的并且很好,我只是有一些小的警告。

就“过度工作”而言,我认为就地修改字符串是过度工作,因为在每个删除的空白字符处,您都需要做以下三件事之一:

  1. 将超过该元素的每个字符向下移动 1(大多数移动,但不需要分配)。
  2. 存储每个位置的索引,以相反顺序迭代并将每个元素向下移动 1(移动较少,但需要分配)。
  3. 存储每个位置的索引,跟踪起始当前空白 block 的索引、当前空白 block 的结尾和下一个 block 的开始,并将每个元素向下移动,然后跟踪这些移位(最复杂的,所需的移动次数最少,而且计算成本仍然比需要的高)。

或者..你可以分配一个新的字符串。有时,简单是强大的。

对于其他方面,一个主要问题是不要不必要地 panic ,尤其是不要因为无法打开文件而 panic 。展开,除非你能证明它们不应该发生,否则对生产代码不利。具体来说,以下行可能会引起 panic 。

let f = BufReader::new(file().unwrap());

最好将该函数替换为:

pub fn parse() -> io::Result<Vec<Vec<String>>> {
let f = BufReader::new(file()?);
f.lines()
.map(|line| {
line.map(|x| {
x
.split_whitespace()
.map(|x| x.to_string())
.collect()
})
})
.collect()
}

这样,parse 的调用者就可以适本地处理任何错误,无论是在 BufReader 创建期间还是在 lines() 期间发生的任何错误。

关于rust - 使用 to_string 是按行读取文件并按空格拆分的最干净的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57385016/

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