如何实现链表的前置而不需要分配给新变量?

2023-12-04

有人告诉我如何实现链表:

enum List {
    Cons(u32, Box<List>),
    Nil,
}

impl List {
    fn prepend(self, elem: u32) -> List {
        Cons(elem, Box::new(self))
    }
}

当我想使用时prepend,我需要执行以下操作:

list = list.prepend(1);

但是,我想创建一个不需要每次都创建新变量的函数prepend返回。我只是想改变list变量本身使用prepend:

list.prepend(1);

这是我提出的一种实现,但它是不正确的:

fn my_prepend(&mut self, elem: u32) {
    *self = Cons(elem, Box::new(*self));
}

错误是:

error[E0507]: cannot move out of borrowed content

List::prepend must move self因为这确实是正在发生的事情。列表的新头是一个新对象,旧头被移动到堆上,使旧变量无效。

Inside my_prepend你有一个可变的引用self,但随后你移动它的值,以便self参考变得无效。虽然只是暂时无效,但是消息就是这样的"cannot move out of borrowed content"正在抱怨。

解决这个问题的一种方法是移动self输出到变量中并且同时地替换为Nil, 所以这样self引用永远不会无效。你可以这样做mem::replace:

use std::mem;

fn my_prepend(&mut self, elem: u32) {
    // Move the value of self into head, and leave self as Nil so it isn't invalid
    let head = mem::replace(self, List::Nil);
    // Reassign to self with the prepended value
    *self = head.prepend(elem);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现链表的前置而不需要分配给新变量? 的相关文章

随机推荐

  • Selenium:打开扩展的弹出窗口

    我正在尝试使用 Selenium 为我的扩展编写 E2E 测试 对于我的测试 我需要打开扩展程序的弹出页面 就好像用户单击扩展程序的徽标 位于浏览器的右下角 一样 我已经成功地使用扩展程序初始化了 ChromeDriver 方法是 Chro
  • 用于集成 Microsoft 单元测试框架 (VS2017) 的 CMake

    与我之前的问题类似 但专门针对 Microsoft 单元测试框架 Visual Studio 2017集成了C 单元测试 MS单元测试 google测试等 如何创建一个 CMakeLists txt 文件来创建这样一个项目 该项目将使用集成
  • 简单 AOP 示例中的 UnsupportedPointcutPrimitiveException

    我尝试运行一个简单的 aop 示例this地点 我有 spring aop 和aspectj aspectjweaver jars Aspect public class StringAspect Pointcut call String
  • iOS:只调用一个方法一次

    您好 我想知道如何在应用程序生命周期中仅调用一次方法 我的应用程序应该从服务器下载一些文件 而我只需要执行一次 我的意思是每次安装一次 这是我的方法 Download some images from server and save it
  • Eclipse Struts 2 Hibernate JPA 配置

    我正在使用 Eclipse 构建一个 Web 应用程序 我想在其中使用框架 Struts 2 和 Hibernate 这次我没有使用 Maven 只是因为我想知道如果我不使用 Maven 如何让它工作 Version 支柱2 5 休眠5 2
  • SignalR 和 OpenId 连接

    我有一个使用的服务器ASP NET Core Web Api and OpenIddict作为授权框架 现在我添加了一个SignalR主机并想为其添加授权 From 不同来源我找到SignalR JS 客户端 希望您在查询字符串中或通过 c
  • 更新 DOM 时相对定位的元素不会移动(IE6 和 IE7)

    我有一个带有几个字段集的表单 一个字段集具有用户设置的时间偏好表 用户可以添加和删除时间偏好 当他们添加一行时 表行会使用 jQuery 动态插入到 DOM 中append 问题在于 在 IE6 和 IE7 中 添加新的表格行时 页面上任何
  • 处理页错误陷阱后的指令指针值

    老实说 我真的对这个特定的虚拟内存相关概念感到困惑 Q1 当发生页错误时 处理器是否先完成当前指令的执行 然后将 IP 寄存器内容 下一条指令的地址 移入堆栈 或者 它中止当前正在执行的指令并将指令指针寄存器的内容移至堆栈 Q2 如果第二种
  • Kivy 时钟和弹出窗口

    如何正确为 switch id 和 switch id popup 创建活动属性 以便我可以使用 kivy 时钟在timer loop内部创建条件语句 我在类似的问题上得到了很好的反馈 再次感谢 eyllanesc 但由于涉及弹出窗口 我无
  • 通过Jsoup下载的网页源与实际的网页源不一样

    我对此感到严重关切 我已经搜索了堆栈溢出和许多其他网站 他们在每个地方都给出相同的解决方案 我已经尝试了所有这些 但我无法解决这个问题 我有以下代码 Document doc Jsoup connect url timeout 30000
  • Xamarin.Forms 中可重用的 XAML 控件

    我写了一篇不错的Grid与其他一些控件 例如 Entry and Image现在我想以最简单的方式重用它 这是我的控制Email财产
  • 将可枚举 linq 列表转换为类型化列表

    我遇到以下问题 我使用 linq 以这种方式过滤一些数据 var listPerson from objPerson in ListPerson select new objPerson IdPerson objPerson ApePers
  • Python - TypeError:浮点对象不可调用错误

    到目前为止已经得到以下代码 class beam object def init self E I L self E E self I I self L L self Loads 0 0 0 0 Force distance along b
  • 标题标签内的sup标签html

    我需要注册商标作为工具提示中的上标 我尝试使用sup标题标签内 p title Hello World p 但我明白了sup在工具提示中 如何确保忽略sup标签并且R在工具提示内显示为上标 Use reg 反而 你也许也可以写
  • 内存映射文件有哪些优点?

    我一直在研究一个项目的内存映射文件 并且非常感谢以前使用过它们或决定不使用它们的人的任何想法 为什么 我特别担心以下问题 按重要性排序 并发性 随机访问 表现 使用方便 可移植性 我认为优点实际上是与传统的读取文件方法相比 减少了所需的数据
  • 使用 PHPMailer 发送 unicode 表情符号

    我正在尝试通过 PHPMailer 5 2 发送 unicode 表情符号 但我发送的电子邮件收到的是奇怪的字符而不是表情符号 我目前正在发送 HTML 电子邮件 我刚刚echo包含一些 utf 8 表情符号的字符串并检查电子邮件源 该字符
  • 拖放多个文件的批处理文件?

    我希望能够完成与下面类似的事情 但是使用 pcutmp3 拖放多个文件的批处理文件 我很难理解 Joey 所做的添加 因为我通常不这样做 但我想将多个文件 cue 放在一个批处理文件上并让它运行多次 这就是批处理文件中的以下行发生 echo
  • 致命错误:C 中超出了 30 秒的最大执行时间:[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我对这个错误感到非常震惊 根本无法得到它 Fatal
  • 返回 AsAsyncEnumerable() 时出现 ObjectDisposeException

    在我的 NET Core 3 WebAPI 项目中 我有以下简单的方法调用 HttpGet ViewerRoles public IAsyncEnumerable
  • 如何实现链表的前置而不需要分配给新变量?

    有人告诉我如何实现链表 enum List Cons u32 Box