如何查找或插入 Vec [重复]

2023-11-26

我正在尝试编写一个函数,该函数查找返回对 Vec 中现有元素的可变引用,或者如果不存在则将其插入并返回对新元素的可变引用。

我已经尝试过几次,但借用检查员不相信。我已将尝试编写的代码简化为下面的示例,该示例给出了相同的错误。

fn mut_find_or_insert<T: PartialEq>(vec: &mut Vec<T>, val: T) -> &mut T {
    if let Some(u) = vec.iter_mut().find(|u| **u == val) {
        u
    } else {
        vec.push(val);
        vec.last_mut().unwrap()
    }
}

游乐场链接:

Rust 给了我以下编译器错误(完整消息通过游乐场链接):

error[E0499]: cannot borrow `*vec` as mutable more than once at a time

这似乎应该可以在 Rust 中实现,但是我不清楚如何重新实现它以避免借用检查器错误。


这不能按书面方式工作的原因是当前借用检查器的限制。这非常类似于NLL 案例 #3,其中编译器过度热心地借用了整个match当借用仅在其中一个分支中使用时的语句。使用实验性的“Polonius”借用检查器(可在夜间编译器上使用-Z polonius标志),您的代码将按原样接受。

在稳定的编译器中工作,重新设计数据结构可能是个好主意塞巴斯蒂安·雷诺的回答也建议,但如果你需要让这个工作与Vec,您可以通过简单地使用索引来结束借用来解决这个问题:

fn mut_find_or_insert<T: PartialEq>(vec: &mut Vec<T>, val: T) -> &mut T {
    if let Some(i) = vec.iter().position(|each| *each == val) {
        &mut vec[i]
    } else {
        vec.push(val);
        vec.last_mut().unwrap()
    }
}

这是有效的,因为调用的结果position不是参考,所以借用vec期间不举行if let.

这类似于以下问题,这些问题设法使用循环的早期返回来找到相同的限制:

  • 即使 NLL 打开,循环中的双重可变借用错误也会发生
  • 当返回包含引用的结果时,“变量的寿命不够长”,但它确实寿命足够长
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查找或插入 Vec [重复] 的相关文章

随机推荐

  • ScrollView 正在捕获谷歌地图的触摸事件

    我有一个水平滚动视图 其中包含视图组的层次结构 最后是谷歌地图 我的问题是 HSV 正在捕捉地图上的左右阻力 我试过了 hsv requestDisallowInterceptTouchEvent true 乃至 mapView getPa
  • 如何限制 ngFor 重复 Angular 中的某些项目?

    My Code li class dropdown item li
  • 在没有 UWP 的情况下从 C++/WinRT 使用 FileOpenPicker 时出现“无效窗口句柄”错误

    我正在尝试使用C WinRT写一些有趣的东西 由于我的 Windows 编程经验很少 也没有 C CX 经验 所以我开始尝试示例程序 OCR 示例程序是关于光学字符识别的 我将其修改为面部检测器 基于控制台 效果非常好 我想将获取文件从命令
  • 在没有互联网的情况下从 R 中的 Plotly 导出 PNG 文件

    在这个问题中 从 R 中的 Plotly 导出 PNG 文件我问如何将 Plotly 绘图导出到磁盘 我使用了该功能plotly IMAGE 但后来发现该函数使用了 Plotly 互联网服务器 问题是 现在 Plotly JavaScrip
  • Prolog 中的随机项

    我知道我能做到X is random 10 获取 0 到 10 之间的随机数 但是是否有类似的命令来获取随机匹配项 SWI Prolog v6 有random member 2定义如下 listing random member rando
  • 如何在不平滑任何内容的情况下放大 UIImage?

    我想以这样的方式放大 UIImage 以便用户可以非常清晰地看到 UIImage 中的像素 当我将其放入 UIImageView 并放大变换矩阵时 UIImage 会出现抗锯齿和平滑效果 有没有办法通过简单地重复每一行和每一列来获得更大的像
  • 为什么枚举需要显式转换为 int 类型?

    这样做不会丢失数据 那么为什么必须显式地将枚举转换为整数呢 如果它是隐式的 那么当您有更高级别的方法时 例如 PerformOperation OperationType Silent type where PerformOperation
  • HttpResponse 不包含 Dot Net Core 的 AddHeader 的定义

    将项目移至 Net Core 时 AddHeader抛出错误 错误 CS1061 HttpResponse 不包含定义 AddHeader 且没有扩展方法 AddHeader 接受第一个 可以找到 HttpResponse 类型的参数 您是
  • 哪些操作系统不会在程序退出时释放内存?

    这个问题让我很好奇 像这样的问题总是得到诸如 它通常是安全的 但你不应该假设操作系统会为你做这件事 这样的答案 这对我来说听起来是个好建议 但我想知道 是否有任何积极开发 发布 的不执行此操作的操作系统 这是恐龙时代 80年代 就被修复的东
  • 仅返回 mongo 投影中的数组值

    有没有办法只返回 mongodb 投影中属性的值 例如 我有一个文档 其中有一个属性 其值为数组 我希望查询的返回对象只是数组 而不是property 例子 文档 db test insert name Andrew attributes
  • 如何在Android中播放在线视频?

    我正在 Android 中开发一个示例媒体播放器应用程序来播放在线视频 我已经开发了一些代码来播放视频 它可以很好地播放 SD 卡中的视频 但我在这方面面临两个问题 1 当我打开在线视频应用程序时 它会显示视频 但不会播放视频 一段时间后
  • Android XML DOM 解析中如何解析同名标签?

    我无法在这里解析我的 XML 它仅返回 项目 My AndroidActivity由于太大而无法显示 这就是为什么我只展示了负责解析的部分 我的 XML 看起来像这样
  • 使用 pyparsing 的递归表达式

    我试图弄清楚如何执行左关联表达式 其中递归 不包含在任何内容中 表达式是可能的 例如 我想做 expr OP expr 解析 2 个操作 例如1 x 2 x 3 into expr OP expr OP expr result 如果我试图阻
  • connection.setRequestProperty 和显式写入 urloutputstream 相同吗?

    URL url new URL http www example com comment HttpURLConnection connection HttpURLConnection url openConnection connectio
  • 如何添加触发翻译的谷歌翻译链接?

    我有一个保加利亚语网页 我希望我的用户能够将其一键翻译成英语 此外 当用户进入页面时 页面顶部不应有任何翻译横幅 在用户单击翻译链接后可以 我尝试过使用 googtrans bg en doc 但它不起作用 而且由于以下代码 它还在页面顶部
  • rxjs中如何做链序列

    我想要这样的事情 this myService doSomething subscribe result gt doSomething then gt dosthelse then gt dosanotherthing 所以我想链接 the
  • CSS 重新居中换行元素

    我以为这很简单 但事实证明有点令人头疼 当用户调整浏览器大小并导致其中一个 或多个 换行到下一行时 我试图让图像网格重新居中 我尝试过给网格包装器 display inline block 它的父级值为 text align center
  • 如何在“Java Swing”中获取鼠标悬停事件

    我有一个JPanel其中有多个组件 就像一些JLabels JTextBoxes JComboBoxes JCheckBoxes etc 如果用户将鼠标悬停在这些组件上 3 秒 我想显示一个弹出帮助窗口 到目前为止我添加了一个MouseLi
  • Azure 访问令牌 - Jwt.io 中的签名无效

    这真是一场噩梦 我在使用 jwt io 验证 Azure 访问令牌签名时遇到问题 不管我做什么 答案总是无效的签名 有人可以尝试帮忙解决这个问题吗 我的步骤 我从 MSAL Java 应用程序示例 msal java webapp samp
  • 如何查找或插入 Vec [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个函数 该函数查找返回对 Vec 中现有元素的可变引用 或者如果不存在则将其插入并返回对新元素的可变引用 我已经尝试过几次 但借用检查员不相信 我已将尝试编写的代码简化为下面的示例 该示例给出了相