我有一个包含多行的CSV文件中的字符串:
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());
}
:
error[E0282]: unable to infer enough type information about `_`
--> src/main.rs:9:13
|
9 | let values = trimmed.split(',').collect();
| ^^^^^^ cannot infer type for `_`
|
= note: type annotations or generic parameter binding required
但是我收到了错误
from openpyxl import load_workbook
# The source xlsx file is named as source.xlsx
wb=load_workbook("source.xlsx")
ws = wb.active
first_column = ws['A']
# Print the contents
for x in xrange(len(first_column)):
print(first_column[x].value)
答案 0 :(得分:3)
你需要给编译器一些关于你想要values
的提示。
你可以说你想让它成为某事的载体:
let values: Vec<_> = trimmed.split(',').collect();
Working example in the playground
关于代码的其他一些注释,如果您有兴趣的话。
snake_case
。因此,矢量应该被称为main_vec
和child_vec
。child_vec
推送到main_vec
时,无需克隆main_vec
。将其推送到child_vec
会转移所有权,并且循环重新声明finally,i add a model role
pModel.append({"prname":pname[i],"prstate": qsTr(Jsclient.pstate)});
,因此编译器可以保证此处没有违反任何内容。答案 1 :(得分:2)
Another solution,基于迭代器:
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);
}
正如@Simon Whitehead已经说过,collect()
唯一需要做的就是指定类型,因为这是一种通用方法。但在某些情况下,它也可能由编译器本身推断出来。
上面的代码对类型规范非常冗长:实际上你可能会保留Vec
的值类型未指定,并让编译器推导出这样的代码:
let main_vec = raw_string.lines()
.map(|s| s.trim().split(',').map(String::from).collect::<Vec<_>>())
.collect::<Vec<_>>();
有关详细信息,请参阅definition of collect()
method。