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

String 如何将字符串转换为Rust中的字符串数组/向量,string,vector,rust,String,Vector,Rust,我有一个CSV文件中的字符串,其中包含多行: 编辑实际的绳子上没有锈。 我正在尝试将这些内容推入一个Vec: 但是我得到了错误 错误[E0282]:无法推断有关的足够类型信息`_` -->src/main.rs:9:13 | 9 | let values=trimmed.split(',').collect(); |^^^^^无法推断的类型`_` | =注意:需要类型批注或泛型参数绑定 您需要给编译器一点提示,说明您希望值是什么 你可以说你希望它是某物的向量: let值:Vec=trimmed.

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

编辑实际的绳子上没有锈。 我正在尝试将这些内容推入一个
Vec

但是我得到了错误

错误[E0282]:无法推断有关的足够类型信息`_`
-->src/main.rs:9:13
|
9 | let values=trimmed.split(',').collect();
|^^^^^无法推断的类型`_`
|
=注意:需要类型批注或泛型参数绑定

您需要给编译器一点提示,说明您希望
值是什么

你可以说你希望它是某物的向量:

let值:Vec=trimmed.split(',').collect();

如果您感兴趣,可以提供一些关于代码的其他说明

  • 变量名应为
    snake\u case
    。因此,向量应称为
    main\u-vec
    child\u-vec
  • 子对象推送到
    主对象时,不需要克隆它。将其推到
    main_-vec
    会转移所有权,循环会重新声明
    子_-vec
    ,因此编译器可以保证此处没有违反任何内容

您需要给编译器一点提示,说明您希望
值是什么

你可以说你希望它是某物的向量:

let值:Vec=trimmed.split(',').collect();

如果您感兴趣,可以提供一些关于代码的其他说明

  • 变量名应为
    snake\u case
    。因此,向量应称为
    main\u-vec
    child\u-vec
  • 子对象推送到
    主对象时,不需要克隆它。将其推到
    main_-vec
    会转移所有权,循环会重新声明
    子_-vec
    ,因此编译器可以保证此处没有违反任何内容
,基于迭代器:

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);
}
有关更多信息,请参阅基于迭代器的。

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);
}

有关更多信息,请参阅。

您真的想要
Vec
?o_O@ildjarn由于OP是“试图推送到一个
Vec
”,似乎他们想要一个
Vec
(两个
Vec
,而不是三个)。@user4815162342:啊,不知怎的,我错过了这一点。也就是说,摆脱childVec应该是答案的一部分。@ildjarn不,你完全正确,对此感到抱歉。OP确实需要一个<代码> VEC<代码>,但是它们的代码是用一个不必要的一个元素向量在中间创建一个<代码> VEC <代码>。真正的答案是使用,因为解析CSV比每个人都想的要难。你真的想要一个<代码> VEC < /代码>?o_O@ildjarn由于OP是“试图推送到一个
Vec
”,似乎他们想要一个
Vec
(两个
Vec
,而不是三个)。@user4815162342:啊,不知怎的,我错过了这一点。也就是说,摆脱childVec应该是答案的一部分。@ildjarn不,你完全正确,对此感到抱歉。OP确实需要一个<代码> VEC < /代码>,但是它们的代码在中间创建了一个不必要的一个元素向量。真正的答案是使用,因为解析CSV比每个人都想的要难。OP需要一个<代码> VEC < /代码>而不是<代码> VEC < /代码>,所以在<代码>分裂< /代码>之后,应该有一个<代码>地图。(String::from)
或诸如此类的方法。@ildjarn这似乎是我的问题,我找不出正确的位置来放置
String::from()
.to_String()
方法。@mjwrazor:维克托最后有什么,再加上
拆分后的
.map(String::from)
.map(| | s | s.trim().split(',')。map.)(String::from.collect::())
(其他选项可用,例如
.map(|s | s.trim().split(',')).map(ToString::to_String.collect:())
,但我认为使用
from
读起来最好。)OP想要一个
Vec
而不是
Vec
,所以在
拆分之后应该有一个
.map(String::from)
或诸如此类的方法。@ildjarn这似乎是我的问题,我找不出正确的位置来放置
String::from()
.to_String()
方法。@mjwrazor:Victor在末尾有什么,加上
拆分后的
.map(String::from)
.map(| s | s.trim().split(',').map(String::from).collect:())
(其他选项可用,例如
.map(|s | s.trim().split(',')).map(ToString::to_string)。collect:())
,但我认为使用
From
读取效果最好。)此解决方案也有效。此解决方案也有效。
let values: Vec<_> = trimmed.split(',').collect();
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);
}
let main_vec = raw_string.lines()
                         .map(|s| s.trim().split(',').map(String::from).collect::<Vec<_>>())
                         .collect::<Vec<_>>();