首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Vec中如何使用靶场?

在Vec中如何使用靶场?
EN

Stack Overflow用户
提问于 2018-10-05 21:39:01
回答 1查看 6.2K关注 0票数 5

此代码运行良好:

代码语言:javascript
运行
复制
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],但是itermap没有工作:

代码语言:javascript
运行
复制
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`

我也有在锈菌用户论坛上问了这个问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-05 22:05:19

1..5这样的范围已经是一个迭代器,所以您不必调用iter()来创建一个:

代码语言:javascript
运行
复制
let v: i32 = (1..5).map(|x: i32| x.pow(2)).sum();

还请注意,由于此迭代器对值进行迭代,所以引用将消失。

如果您绝对需要一个Vec,则需要首先将范围收集到其中:

代码语言:javascript
运行
复制
let v: i32 = (1..5)
    .collect::<Vec<i32>>()
    .iter()
    .map(|&x: &i32| x.pow(2))
    .sum();
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52673580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档