如何以函数方式将字符串向量转换为整数向量?

时间:2015-12-04 14:32:12

标签: vector functional-programming rust

我试图将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>

3 个答案:

答案 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,因此您必须从每个已解析的元素中提取值。您可能希望以不同的方式行事,例如仅过滤成功的结果。