如何将循环中的变量更新为对循环内创建的值的引用?

2024-04-18

我想进入一个带有变量的循环n这是函数借用的。每一步,n取新值;当退出循环时,工作在其他变量的帮助下完成,并且n will never再次使用。

如果我不使用引用,我会有这样的东西:

fn test(n: Thing) -> usize {
    // stuff
    let mut n = n;
    for i in 1..10 {
        let (q, m) = n.do_something(...);
        n = m;
        // stuff with x
    }
    x
}

x是一些计算的结果q and m但这是一个usize类型,我在这部分代码中没有遇到任何问题。我没有测试这段代码,但这就是想法。我可以使这样编写的代码工作。

因为我想做一个参考;我试着写:

fn test(n: &Thing) -> usize {
    // stuff
    let mut n = n;
    for i in 1..10 {
        let (q, m) = (*n).do_something(...);
        n = &m;
        // stuff with x
    }
    x
}

现在代码将无法编译,因为m寿命比n。我尝试通过做一些棘手的事情或克隆事情来使其发挥作用,但这不是正确的方法。在 C 中,代码可以工作,因为我们不关心什么n指向退出循环的时间n循环后不使用。我完全理解这是 Rust 和 C 的不同之处,但我很确定 Rust 中存在一种干净的方法。

认为我的问题非常普遍;我不要求一些ad-hoc针对特定问题的解决方案。


As 克里斯·爱默生指出 https://stackoverflow.com/a/41745081/155423,你正在做的是unsafe而且用 C 语言编写这样的代码可能也不合适。您引用的变量在每个末尾超出范围循环迭代,因此你会有一个悬垂指针在下一次迭代开始时。这将导致 Rust 试图阻止的所有内存错误;Rust 阻止你做一些你认为安全的坏事.

如果您想要可以借用或拥有的东西;那是一个Cow https://doc.rust-lang.org/std/borrow/enum.Cow.html:

use std::borrow::Cow;

#[derive(Clone)]
struct Thing;

impl Thing {
    fn do_something(&self) -> (usize, Thing) {
        (1, Thing)
    }
}

fn test(n: &Thing) -> usize {
    let mut n = Cow::Borrowed(n);
    let mut x = 0;

    for _ in 1..10 {
        let (q, m) = n.do_something();
        n = Cow::Owned(m);
        x = x + q;
    }

    x
}

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

如何将循环中的变量更新为对循环内创建的值的引用? 的相关文章

随机推荐

  • Java 堆被无法访问的对象淹没

    我们的 Java EE 应用程序开始出现一些严重问题 具体来说 应用程序在启动后几分钟内就运行了高达 99 的老年代堆 不会抛出 OOM 但实际上 JVM 没有响应 jstat 显示老年代的大小根本没有减少 没有垃圾收集正在进行 并且kil
  • 防止 TWIG 删除变量前的空格

    我有这个用例 范围内的默认文本 将在整个页面中使用 使用 jQuery 将文本从 占位符 更改为 特定情况 Ie 在 html 中我想这样做 树枝 html 和 js block content set location span Some
  • MassTransit 是否支持基于 HTTP 传输的 MSMQ?

    HTTP 传输自 MSMQ 3 0 起就可用 但恐怕 MassTransit 不提供使用 HTTP 协议作为队列之间的传输协议的功能 关于这个有一个非常相似的问题here https stackoverflow com questions
  • 同时从多个应用程序访问网络摄像头

    问题背景 有两个不同的 Windows 应用程序正在尝试同时访问计算机上的网络摄像头 目前 只有一个应用程序能够访问它 我希望能够允许两个应用程序同时访问网络摄像头 我的问题的一个常见示例是 Skype 和 yahoo Messenger
  • 浏览器对 SVG SMIL(动画)的支持级别

    有谁知道流行浏览器中 SVG SMIL 动画支持的当前状态 看起来 Safari Chrome 和 Opera 都支持它 Firefox 在其开发页面中有关于已添加 SMIL 支持的令人困惑的报告 但我在 v3 6 中没有看到它 https
  • Java Comparator.comparing 不比较?

    下列的这个问题 https stackoverflow com questions 18129807 in java how do you sort one list based on another关于按另一个列表对列表进行排序 我尝试做
  • 删除列表内数据框中的列

    我根据 A 列中的因子水平 从数据框中创建了一个列表 在列表中 我想删除该列 我的脑子里在说 lapply 但没有别的意思 P A ID Test A 1 A 1 B ID Test B 1 B 3 B 5 进入这个 A Test 1 1
  • 由 VBA 关闭的工作簿未关闭引用的 IsAddin 工作簿

    Version Excel 2016 桌面版 Context VBA 项目 客户端 xlsb 具有对另一个工作簿的引用 工具 菜单 gt 引用 参考书目isn t一个插件 它是一个普通的 xlsb 文件 这会导致如果客户书籍仍处于打开状态
  • Scala 中对象的 Mockito

    我正在使用 Scala 2 10 specs2 和 Mockito 我想模拟 scala io Source fromURL 问题似乎是 fromURL 是一个函数io Source 的对象 http www scala lang org
  • C++:错误:“类”没有命名的成员

    对于我的毕业论文 我正在编写一些有限元代码 或者更准确地说 我正在修改现有程序 该程序基于我的教师提供的 2 类库 因此 我无法修改这些类 因为它们是通用的 我创建了一个类BurgersMSrc 它继承自父类ValSrc 我用一种方法扩展了
  • Java ImageWriter BufferedImage 到 GIF

    我希望你们能帮我解决这个问题 我不确定这是 Java 中的错误还是我做错了什么 但我会选择后者 我想将 BufferedImage 转换为 GIF 图像 然后我希望将 GIF 以字节数组的形式保存在内存中 我不想将文件保存到磁盘 该程序应该
  • >> Python 中的运算符

    什么是 gt gt 运营商做什么 例如下面的操作是做什么的10 gt gt 1 5 do 它是右移位运算符 将所有位向右 移动 一次 10 的二进制是 1010 向右移动它变成 0101 这是 5
  • Python 单击多个命令名称

    是否可以使用 Python Click 执行类似的操作 click command name my command my cmd def my command pass 我希望我的命令行是这样的 mycli my command and m
  • Spring JPA 原子获取或创建方法

    我正在使用 Spring Boot 和JPA with Hibernate 我有一个方法 进入我的服务 检查数据库中是否已存在特定实体 例如我 需要检查是否已经有用户 为此 我使用自定义 JPQL 查询我的 JPA 存储库 之后 如果上一步
  • 在 Android 中打开日历

    如何在按钮单击上打开日历并获取可单击的日期 看一下这个 http www developer com ws article php 3850276 Working with the Android Calendar htm http www
  • 如何使用 Phonegap 将图像加载到 HTML5 Canvas 上

    尝试将图像加载到 html5 画布上 然后使用 Phonegap 在 Android 上运行 html5 这是我的 HTML
  • Vaadin 14 组合框选择鼠标悬停时的工具提示

    我正在使用 Vaadin 14 Java 我有一个带有枚举的组合框作为可能的选择项 我想在组合框中显示枚举作为可能的选择 但我想在鼠标悬停 工具提示上显示较长的属性 名称 我看到旧版本的 Vaadin 也存在同样的问题 显然没有解决方案 并
  • CSS 注入在 content_scripts 中使用声明失败,但在通过注入的 JavaScript 加载时有效

    我注意到将 CSS 注入第三方页面的预期方式似乎无法正常工作 相关的manifest json部分 content scripts matches youtube com watch v css css youTubeInject css
  • 我无法访问 SQL 2005 实例的所有原因

    我已经安装了 SQL 2005 Express 的实例
  • 如何将循环中的变量更新为对循环内创建的值的引用?

    我想进入一个带有变量的循环n这是函数借用的 每一步 n取新值 当退出循环时 工作在其他变量的帮助下完成 并且n will never再次使用 如果我不使用引用 我会有这样的东西 fn test n Thing gt usize stuff