如何计算两个 Rust 数组/切片/向量的点积?

9

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

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

这个操作失败了

error: expected one of `)`, `,`, `.`, `?`, or an operator, found `=>`
 --> src/main.rs:4:58
  |
4 |     let r = a.iter().zip(b.iter()).map(|x, y| Some(x, y) => x * y).sum();
  |                                                          ^^ expected one of `)`, `,`, `.`, `?`, or an operator here

我也尝试了以下方法,但都失败了:

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

如何正确地执行这个操作?

(游乐场)

1个回答

15

map()中,您不必处理迭代器返回的Option的事实。 map()会处理这个问题。 您需要提供一个接受两个借用值元组的函数。 您在第二次尝试中接近了,但语法有误。 这是正确的:

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

您的最终程序需要在r上进行注释:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接