使用Iterator :: map

时间:2015-05-24 11:12:07

标签: rust

我正在尝试找到两个向量的点积:

fn main() {
    let a = vec![1,2,3,4];
    let b = a.clone();
    let r = a.iter().zip(b.iter()).map(|x,y| Some(x,y) => x*y).sum();
    println!("{}", r);
}

失败
$ rustc test.rs
test.rs:4:56: 4:58 error: expected one of `,`, `.`, or an operator, found `=>`
test.rs:4     let r = a.iter().zip(b.iter()).map(|x,y| Some(x,y) => x*y).sum();

我也试过这些,所有这些都失败了:

let r = a.iter().zip(b.iter()).map(|x,y| => x*y).sum();
let r = a.iter().zip(b.iter()).map(Some(x,y) => x*y).sum();

这样做的正确方法是什么?

(Playground link)

1 个答案:

答案 0 :(得分:9)

map()中,您不必处理迭代器返回Option这一事实。这由map()处理。你需要提供一个函数来获取两个借来的值的元组。你第二次尝试就接近了,但语法错误。这是正确的:

a.iter().zip(b.iter()).map(|(x, y)| x*y).sum()

您的最终程序需要更多注释以及使用不稳定的功能.sum()

// This is needed to use `.sum()`.
// It requires that the program is compiled with the nightly version.
#![feature(core)]

fn main() {
    let a: Vec<i32> = vec![1,2,3,4];
    let b = a.clone();

    // first try
    let r: i32 = a.iter().zip(b.iter()).map(|(x, y)| x*y).sum();

    println!("{}", r);
}

(Playground)

关于传递给map的闭包的更多信息:我写了...map(|(x, y)| x*y),但是对于更复杂的操作,你需要按如下方式分隔闭包体:...map(|(x, y)| { do_something(); x*y })