此代码运行良好:
fn main() {
let v: i32 = vec![1, 2, 3, 4, 5].iter().map(|&x: &i32| x.pow(2)).sum();
println!("{}", v);
}
我试图用vec![1, 2, 3, 4, 5]
替换vec![1..5]
,但是iter
和map
没有工作:
error[E0631]: type mismatch in closure arguments
--> src/main.rs:2:36
|
2 | let v: i32 = vec![1..5].iter().map(|&x: &i32| x.pow(2)).sum();
| ^^^ ------------------- found signature of `for<'r> fn(&'r i32) -> _`
| |
| expected signature of `fn(&std::ops::Range<{integer}>) -> _`
error[E0599]: no method named `sum` found for type `std::iter::Map<std::slice::Iter<'_, std::ops::Range<{integer}>>, [closure@src/main.rs:2:40: 2:59]>` in the current scope
--> src/main.rs:2:61
|
2 | let v: i32 = vec![1..5].iter().map(|&x: &i32| x.pow(2)).sum();
| ^^^
|
= note: the method `sum` exists but the following trait bounds were not satisfied:
`std::iter::Map<std::slice::Iter<'_, std::ops::Range<{integer}>>, [closure@src/main.rs:2:40: 2:59]> : std::iter::Iterator`
`&mut std::iter::Map<std::slice::Iter<'_, std::ops::Range<{integer}>>, [closure@src/main.rs:2:40: 2:59]> : std::iter::Iterator`
我也有在锈菌用户论坛上问了这个问题。
发布于 2018-10-05 22:05:19
像1..5
这样的范围已经是一个迭代器,所以您不必调用iter()
来创建一个:
let v: i32 = (1..5).map(|x: i32| x.pow(2)).sum();
还请注意,由于此迭代器对值进行迭代,所以引用将消失。
如果您绝对需要一个Vec
,则需要首先将范围收集到其中:
let v: i32 = (1..5)
.collect::<Vec<i32>>()
.iter()
.map(|&x: &i32| x.pow(2))
.sum();
https://stackoverflow.com/questions/52673580
复制相似问题