为什么嵌套迭代器闭包不会从外部作用域复制值

2023-11-25

我正在尝试使用嵌套迭代器,其中内部迭代器使用外部迭代器的值。

vec![0;10].iter().flat_map(|&a| {
    (0..10).map(|b|{
        a + b
    })
});

error: a活得不够长

    (0..10).map(|b|{
                ^^^

注意:引用必须对方法调用有效...

如果我移动内部闭包(move |b|{),但鉴于此,我不明白为什么有必要a是一个整数,可以被复制而不是移动。


Both flat_map and map很懒。内部map不使用a立即但尝试将其“保存”以供以后需要时使用,因此借用a。但是由于a是外部封闭的本地并且您返回map结果,该借用将变得无效。您需要使用内部迭代器:

vec![0;10].iter().flat_map(|&a| {
    (0..10).map(|b|{
        a + b
    }).collect::<Vec<_>>()
});

当然这样效率不高,内部闭包“保留”会好得多a。您可以通过将内部封闭标记为move:

vec![0;10].iter().flat_map(|&a| {
    (0..10).map(move |b|{
        a + b
    })
});

通常,编译器不会让你这样做,因为flat_map关闭不拥有a,它仅具有对它的引用。然而, 因为 Rust 中的数字类型(比如isize)实施Copy特征,编译器将复制a而不是试图移动它,而是给出你想要的行为。请注意,这也是允许您取消引用的原因a (using |&a|) 在里面flat_map;通常这需要拥有a,而不仅仅是对它的引用(这就是.iter()产量)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么嵌套迭代器闭包不会从外部作用域复制值 的相关文章

随机推荐

  • rjava .jcall 问题

    我目前正在开发一个 R 包以将 java 代码集成到 R 中 但是 我在尝试正确调用 java 类方法时遇到问题 到目前为止我已经独立开发了一个java程序并编译成class文件 然后打包为jar文件 我的代码示例如下 library rJ
  • 在Android中设置每天在特定时间重复闹钟

    我正在使用闹钟管理器在每天的特定时间运行闹钟 下面是代码 Calendar calendar Calendar getInstance calendar setTimeInMillis System currentTimeMillis ca
  • 使用 epoll 进行非阻塞 tcp 连接

    我的 Linux 应用程序正在执行非阻塞 TCP 连接系统调用 然后使用epoll wait检测三向握手完成 有时epoll wait两者都返回POLLOUT POLLERR为同一套接字描述符设置的事件 我想了解 TCP 级别发生了什么 我
  • uisearchDisplayController:更改标签“无结果”

    使用 uisearchDisplayController 时如何更改标签 无结果 Regards 我已经成功删除了标签 因为从来没有空结果集 如果因为从服务器获取而没有结果 请将数据源重置为单行 并让它显示空白的表视图单元格 此外 使用逻辑
  • 为什么我在尝试检查偶数/奇数时会收到“类型错误:字符串格式化期间未转换所有参数”?

    这段代码给出了一个错误 print type a whole number n input if n 2 1 print Odd else print Even 我假设我必须对 if 语句中的变量 n 做一些特殊的事情 我是 Python
  • simple_form的collection_radio_button和自定义标签类

    我正在尝试使用 FontAwesome 制作带有无线电集合的星级评级表格 为此我实际上需要更改 simple form 生成的 collection radio button 输入的标签类 但找不到任何明显的解决方案 到目前为止我使用 fo
  • GLM 如何处理翻译

    OpenGL 数学库 GLM 使用以下算法来计算平移矩阵 taken from source code template
  • 如何在Dataset中存储自定义对象?

    根据Spark 数据集简介 在我们期待 Spark 2 0 的同时 我们计划对数据集进行一些令人兴奋的改进 具体来说 自定义编码器 虽然我们目前自动生成各种类型的编码器 但我们希望为自定义对象开放 API 并尝试将自定义类型存储在Datas
  • 在 core-site.xml 中设置 fs.default.name 将 HDFS 设置为安全模式

    我以伪分布式模式在单台机器上安装了 Cloudera CDH4 发行版 并成功测试了它是否正常工作 例如可以运行 MapReduce 程序 在 Hive 服务器上插入数据等 但是 如果我碰巧core site xml文件有fs defaul
  • JobIntentService onComplete 发生崩溃

    我收到以下 Android 8 的崩溃报告 但我找不到原因或解决此问题 java lang IllegalArgumentException Given work is not active JobWorkItem id 1 intent
  • Angular 2错误:加载块多次失败

    我在服务器上部署了 Angular 2 应用程序 该应用程序运行良好 此外 我还记录角度应用程序的错误 以便我可以解决它们并使我的应用程序更加稳定 我不断得到Loading chunk failed error Error Uncaught
  • 在 javascript 中选择 OOP 模式

    我在其他人的帮助和一些资源的帮助下将这些放在一起 我做了一个一切的小提琴 下面发布了精简的代码 基本上我已经学会了如何使用这些模式 但我很好奇这些方法之间更根本的区别 下游代码实际上与这些模式中的任何一种都相同 但是除了个人偏好之外 是否有
  • 我何时以及为什么应该在 Android 应用程序中使用片段? [复制]

    这个问题在这里已经有答案了 我经常需要应用程序的不同部分拥有自己的特殊行为和 UI 但我不知道片段有何帮助 在大多数情况下 我认为创建 2 个不同的活动 例如 1 个用于平板电脑 1 个用于手机 并在第三类中共享常见行为和事件会更快 那么
  • Java中如何获取unicode字符的十进制值?

    我需要一种编程方式来获取字符串中每个字符的十进制值 以便我可以将它们编码为 HTML 实体 例如 UTF 8 著者名 Decimal 33879 32773 21517 我怀疑您只是对以下内容的转换感兴趣char to int 这是隐式的
  • 如何在 PHP 中不使用 ord() 将字符串转换为 ASCII 值?

    我正在寻找将字符串 Hello world 转换为 php 中的 ASCII 值 但我不想使用ord 是否有其他解决方案可以在不使用的情况下打印 ascii 值ord unpack 根据给定的格式从二进制字符串解包到数组中 Use the
  • PHP cURL multi_exec 请求之间的延迟

    如果我运行标准 cURL multi exec 函数 下面的示例 我会立即获得请求的所有 cURL 句柄 我想在每个请求之间设置 100 毫秒的延迟 有办法做到这一点吗 在 Google 和 StackOverflow 搜索中未找到任何内容
  • 在 VsCode 中激活 Anaconda 环境

    我的系统上有 Anaconda VsCode 也在工作 但是如何让 VsCode 在运行 python 脚本时激活特定环境 只需使用 cmd shift P ctrl shift P for MS Windows Search 选择口译员
  • 使用强化学习解决分类问题[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我可以在分类上使用强化学习吗 比如人类活动识别 如何 反馈有两种类型 一是评价性的用于强化学习方法 第二个是有指导意义的用于监督学习 主要用于分类问题 当使用监督学习时 神经网络的权
  • 有没有办法在seaborn点图中设置透明度/alpha级别?

    我想制作一个具有透明度的seaborn点图 以便我可以清楚地看到位于其他不同颜色后面的点 我尝试将 alpha 0 3 添加到对 pointplot 的调用中 并在带有 kind point 的 catplot 中尝试了相同的操作 然而 这
  • 为什么嵌套迭代器闭包不会从外部作用域复制值

    我正在尝试使用嵌套迭代器 其中内部迭代器使用外部迭代器的值 vec 0 10 iter flat map a 0 10 map b a b error a活得不够长 0 10 map b 注意 引用必须对方法调用有效 如果我移动内部闭包 m