使用条目模式时如何改变 HashMap 的其他元素?

2024-01-10

我想用一个HashMap缓存依赖于映射中其他条目的昂贵计算。条目模式仅提供对匹配值的可变引用,但不提供对其余部分的可变引用。HashMap。我非常感谢您提供更好的方法来解决这个(不正确的)玩具示例的反馈:

use std::collections::HashMap;
use std::collections::hash_map::Entry::{Occupied, Vacant};

fn compute(cache: &mut HashMap<u32, u32>, input: u32) -> u32 {
    match cache.entry(input) {
        Vacant(entry) => if input > 2 {
            // Trivial placeholder for an expensive computation.
            *entry.insert(compute(&mut cache, input - 1) +
                          compute(&mut cache, input - 2))
        } else {
            0
        },
        Occupied(entry) => *entry.get(),
    }
}

fn main() {
    let mut cache = HashMap::<u32, u32>::new();
    let foo = compute(&mut cache, 12);
    println!("{}", foo);
}

()

上面代码片段的问题在于cache.entry借用cache一成不变,但我想更新cache以及。


你好已经表明 https://stackoverflow.com/a/52848887/155423如何获得工作代码,但我想更深入地了解代码无法编译的原因。

您提出的代码cannot静态验证内存安全。您的递归调用完全有可能尝试访问相同的索引。查看这个简化的代码以了解一种可能性:

use std::collections::{hash_map::Entry, HashMap};

fn compute(cache: &mut HashMap<u32, u32>) {
    if let Entry::Vacant(_entry) = cache.entry(42) {
        let _aliased_mutable_reference = cache.get_mut(&42).unwrap();
    }
}

现在这个有two可变引用指向相同的值,违反了参考文献规则 https://doc.rust-lang.org/book/second-edition/ch04-02-references-and-borrowing.html#the-rules-of-references.

另外,如果内部调用使用了怎么办?entry它不存在?

use std::collections::{hash_map::Entry, HashMap};

fn compute(cache: &mut HashMap<u32, u32>) {
    if let Entry::Vacant(entry1) = cache.entry(42) {
        if let Entry::Vacant(entry2) = cache.entry(41) {
            entry2.insert(2);
            entry1.insert(1);
        }
    }
}

现在,当您通过以下方式将值插入到地图中时:entry2,映射可能会重新分配底层内存,从而使所持有的引用无效entry1,违反了other参考文献规则。

Rust 阻止您在程序中引入两种可能的内存不安全类型;就像它的设计初衷一样。

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

使用条目模式时如何改变 HashMap 的其他元素? 的相关文章

随机推荐

  • iphone如何指定Class数据类型必须采用某种协议

    在我的应用程序中 我需要返回 Class 作为返回类型 例如 应用 m Class getParserClass return NCCurrencyParser class NCCurrencyParser m interface NCCu
  • 查找文本中出现的大量短语

    我正在构建一个后端并尝试解决以下问题 客户端向后端提交文本 大约2000平均字符数 接收请求的后端端点必须对提交的文本应用短语突出显示 周围有80k要匹配的短语 短语是一个简单的对象 phrase phrase to match link
  • 如何确定 Colliderect 中对象相互穿过的原因

    由于某种原因 Colliderect 无法工作 雨水会穿过人行道 这真的很烦人 因为所有这些未使用的精灵都会产生大量的延迟 import pygame import random class Square pygame sprite Spr
  • 使用 jQuery 从一组选择菜单中删除和添加选项

    这比标题所描述的要复杂一些 但以下是基本的业务规则 上面有三个选择菜单 页面 每个页面都填充相同的内容 选项和值 总会有三个选择 菜单 总会有相同的数字 每个选择中的选项 值 菜单 在任一问题中选择一个问题 菜单将删除该问题作为选项 另外两
  • 使用“car”跨列范围重新编码

    我在网上查了一下 不知道如何申请car重新编码一系列列的值 要重新编码单个列的值 我将运行以下命令 df dv r lt recode df dv 2 1 1 0 0 NA 然后 如果我想对整个 data frame 执行此操作 我可以运行
  • 选项[selected=true] 不起作用

    我有这个命令 visibleSelect 是保存多个选择列表的 jquery 变量 var selectedOption visibleSelect find option selected true 从观察窗我可以看到selectedOp
  • 如何在 Xcode 7.0 beta 2 中运行 iOS 7.1 模拟器?

    我已经安装了最新的 Xcode 7 beta 2 版本 当我尝试在 iOS 7 1 模拟器中运行该应用程序时 它给出了以下错误消息 iOS 7 1 模拟器运行时不可用 无法打开 liblaunch sim dylib 尝试重新安装 Xcod
  • 如何从 gi.repository 导入 gtk.gdk

    我有这个 python 代码 可以截取 x 屏幕的屏幕截图 usr bin python import gtk gdk w gtk gdk get default root window sz w get size print The si
  • 在 Ruby on Rails 中处理国际货币输入

    I have 一个应用程序 http yourdough com处理货币输入 但是 如果您在美国 则可以输入一个数字 12 345 67 在法国 可能是12 345 67 在 Rails 中 是否有一种简单的方法可以使货币输入适应区域设置
  • 将 PictureBox 内容发送到 MsPaint

    如何发送要在 Paint 中编辑的图片框的内容 我想过快速暂时保存它 然后发送要加载的临时地址 但我认为这会导致一些小的保存问题 不幸的是我现在用 C 提供答案 幸运的是 只是语法而不是内容需要改变 假设这是您的图片框控件 获取内容 作为位
  • 为什么 Firefox 不显示我的 SVG 图标,该怎么办?

    Context我正在创建一个仅使用 HTML CSS 和 JS 的静态网站 用于学习目的 我成功地实现了两个主题 为了改变它 我添加了一个SVG图标在一个button元素 然后 svg 根据主题 月亮或太阳 而变化 Problem虽然一切在
  • 在 case 内使用 if、else if、else 和循环进行切换

    出于我的问题的目的 我只包括案例 1 但其他情况是相同的 假设 value 当前为 1 我们转到情况 1 for 循环遍历数组以查看每个元素是否与whatever value 变量匹配 在这种情况下 如果确实如此 我们将 value 变量声
  • plupload 在 IE 9 中似乎无法上传文件。在其他浏览器中可以使用

    在我们的项目中 我们使用 plupload 上传单个 Excel 文件 这适用于除 IE9 之外的所有浏览器 单击上传链接时 会显示文件对话框 但尝试打开 Excel 时没有任何反应 以下是供参考的代码 任何解决此问题的帮助将不胜感激 提前
  • 人们如何使用 Entity Framework 6 进行单元测试,您应该担心吗?

    我刚刚开始进行单元测试和 TDD 我以前涉足过 但现在我决心将其添加到我的工作流程中并编写更好的软件 我昨天问了一个问题 其中包括这一点 但这似乎是一个独立的问题 我坐下来开始实现一个服务类 我将使用该服务类从控制器中抽象出业务逻辑 并使用
  • 获取当月日历中的所有日期

    如何获取当前 某个月份日历中的所有日期 例如本月 如图所示 所以结果是 07 31 2016 08 01 2016 08 02 2016 08 31 2016 09 01 2016 09 02 2016 09 03 2016 有什么想法吗
  • 查找 GeoTiff 图像中每个像素的纬度/经度坐标

    我目前有一个来自 GeoTiff 文件的 171 x 171 图像 尽管在其他情况下 我可能有更大的图像 我的目标是获取图像中的每个像素并将其转换为纬度 经度对 我已经能够根据此 StackOverflow 帖子将图像的角点转换为纬度 经度
  • 如何在多个测试类之间共享 JUnit BeforeClass 逻辑

    目前 我的所有 JUnit 测试都从一个公共基类扩展而来 该基类提供了标记为 BeforeClass and AfterClass注释 所有这些真正做的是设置一堆静态资源 服务供测试使用 由于以下几个原因 这对我来说似乎很尴尬 JUnit4
  • android - 检测向下加速度,特别是电梯

    我希望能够检测到手机向地面加速的情况 可能意味着这里也必须使用重力传感器 我在 Android 文档中阅读了很多有关此主题的内容 包括高通滤波器和低通滤波器以及其他帖子 现在我拥有的是一个代码示例 它在去除重力后获取 X Y 和 Z 轴的加
  • C++ cUrl 通过 api 向 telegram bot 发送图像 buff

    我正在尝试使用 c 将带有 cUrl 的图像 buff 发送到 telegram API 只是要知道我正在 Windows 10 上进行开发 这就是我所做的一切 首先 我使用以下命令从终端使用curl从硬盘发送一张照片 curl s X P
  • 使用条目模式时如何改变 HashMap 的其他元素?

    我想用一个HashMap缓存依赖于映射中其他条目的昂贵计算 条目模式仅提供对匹配值的可变引用 但不提供对其余部分的可变引用 HashMap 我非常感谢您提供更好的方法来解决这个 不正确的 玩具示例的反馈 use std collection