我试图将Vec<&str>
转换为Vec<u16>
,但我无法找到一种实用的方法。
let foo: &str = "1,2,3"; // Parsing a string here
let bar: Vec<&str> = foo.split(",").collect(); // Bar is a nice vector of str's
我需要将bar
变为Vec<u16>
。
答案 0 :(得分:9)
你还没有完全明确你的问题。具体来说,当其中一个字符串无法被解析为数字时会发生什么?使用parse
从字符串解析数字时,它可能会失败。这就是函数返回Array.prototype.slice.call(document.querySelectorAll("table")).forEach(function (table) {
var headertext = [];
var headers = table.querySelectorAll("th");
var tablebody = table.querySelector("tbody");
var i, j, row, col;
for(var i = 0; i < headers.length; i++) {
headertext.push(headers[i].textContent.replace(/\r?\n|\r/,""));
}
for (i = 0; row = tablebody.rows[i]; i++) {
for (j = 0; col = row.cells[j]; j++) {
col.setAttribute("data-th", headertext[j]);
}
}
});
:
Result
这是一个采用向量的解决方案,使用iter
获取迭代器,使用map
更改每个项目,最终使用collect
返回fn parse<F>(&self) -> Result<F, F::Err>
where F: FromStr
。如果解析成功,则会得到Result
。如果任何失败,您将获得Ok
:
Err
或者,您可以将fn main() {
let input = "1,2,3";
let strings: Vec<_> = input.split(",").collect();
let numbers: Result<Vec<u16>, _> =
strings.iter().map(|x| x.parse()).collect();
println!("{:?}", numbers);
}
转换为Result
Option
,然后使用ok
过滤掉None
值来删除失败的转化次数:
fn main() {
let input = "1,2,3";
let strings: Vec<_> = input.split(",").collect();
let numbers: Vec<u16> =
strings.iter().filter_map(|x| x.parse().ok()).collect();
println!("{:?}", numbers);
}
当然,将字符串转换为字符串向量,然后将其再次转换为整数向量,这是一个位傻。如果您实际上有逗号分隔的字符串并且想要数字,请一次性执行:
fn main() {
let input = "1,2,3";
let numbers: Result<Vec<u16>, _> =
input.split(",").map(|x| x.parse()).collect();
println!("{:?}", numbers);
}
答案 1 :(得分:7)
有一个迭代器适配器map
!你可以这样使用它:
let bar : Vec<u16> = foo.split(",").map(|x| x.parse::<u16>().unwrap()).collect();
然后parse
是一个库函数,依赖于特征FromStr
,它可以返回错误,因此我们需要unwrap()
错误类型。 (对于一个简短的例子,这是一个好主意,但在实际代码中,您需要正确处理错误 - 如果您的值不是u16
,那么您的程序将崩溃)
map
接受一个闭包,它按值获取它的参数,然后返回由 lazily 应用该函数获得的迭代器。您在这里{{}} {{}}所有值,但如果您只有collect
个,那么您只会解析其中的5个字符串。
答案 2 :(得分:3)
我作为一个没有真正体验过Rust的人。
fn main() {
let foo: &str = "1,2,3"; // Parsing a string here
let bar: Vec<&str> = foo.split(",").collect(); // Bar is a nice vector of str's
// here the magic happens
let baz = bar.iter().map(|x|x.parse::<i64>());
for x in baz {
match x {
Ok(i) => println!("{}", i),
Err(_) => println!("parse failed")
}
}
}
请注意,由于parse
返回Result
,因此您必须从每个已解析的元素中提取值。您可能希望以不同的方式行事,例如仅过滤成功的结果。