我正在尝试找到两个向量的点积:
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();
这样做的正确方法是什么?
答案 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);
}
关于传递给map
的闭包的更多信息:我写了...map(|(x, y)| x*y)
,但是对于更复杂的操作,你需要按如下方式分隔闭包体:...map(|(x, y)| { do_something(); x*y })