如何在 Rust 中将字符串转换为字符串数组/向量

mjw*_*zor 1 string vector rust

我有一个来自 CSV 文件的字符串,其中包含多行:

编辑。Rust 并不在实际的字符串中。

header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3
Run Code Online (Sandbox Code Playgroud)

我正在尝试将这些推入Vec<Vec<String>>

// the csv is raw_string
let lines = raw_string.lines();
let mut mainVec = Vec::new();

for row in lines {
    let mut childVec = Vec::new();
    let trimmed = row.trim();
    let values = trimmed.split(',').collect();
    childVec.push(values);
    mainVec.push(childVec.clone());
}
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3
Run Code Online (Sandbox Code Playgroud)

Vic*_*voy 5

另一个基于迭代器的解决方案:

fn main() {
    let raw_string = r"rust
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3";

    let main_vec = raw_string.lines()
                             .map(|s| s.trim().split(',').map(String::from).collect::<Vec<String>>())
                             .collect::<Vec<Vec<String>>>();

    print!("{:?}", main_vec);
}
Run Code Online (Sandbox Code Playgroud)

正如@Simon Whitehead 已经说过的,您唯一需要做的collect()就是指定类型,因为这是一个通用方法。但在某些情况下,它也可能由编译器本身推断出来。

上面的代码关于类型规范非常详细:实际上,您可以Vec不指定 的值类型,并让编译器像这样推导它:

let main_vec = raw_string.lines()
                         .map(|s| s.trim().split(',').map(String::from).collect::<Vec<_>>())
                         .collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅method的定义collect()