代码:

use std::collections::HashMap;

fn do_something<'a>(map: &'a mut HashMap<u32, Box<u32>>, key: &u32) -> &'a mut u32 {
    if let Some(b) = map.get_mut(key) { return b.as_mut(); }

    let mut b = Box::new(123);
    map.insert(*key, b);

    b.as_mut()
}

我有两个主要的编译器错误(第三个错误不是这样):

  • borrow map美元的错误
  • 不执行Copy trait的错误

我从我的算法中提取了这段平静的代码,方法都是一样的.用GC用其他语言"翻译"的代码可以很好地编译和运行,但我在这里遇到了错误.我理解为什么会出现这些错误,但我需要我的代码以这种方式工作:在迭代期间,我将 node 存储在映射中,并在下一次迭代中将其用作当前值.我真的很想知道如何让这段代码在没有其他东西的情况下工作,比如Rc.

推荐答案

这是当前borrow 判断器中的已知限制.Polonius应该接受这个代码,无论它何时登陆(目前估计是在2024年的某个时候).

然而,无论如何,基于条目的API是正确的方法.它更简洁地表达了相同的操作,并被当前的borrow 判断器接受:

fn do_something<'a>(map: &'a mut HashMap<u32, Box<u32>>, key: &u32) -> &'a mut u32 {
    map.entry(*key).or_insert_with(|| Box::new(123)).as_mut()
}

(Playground)

Rust相关问答推荐

为什么父作用域中的变量超出了子作用域

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

有没有一种惯用的方法来判断VEC中是否存在变体?

有没有可能让泛型Rust T总是堆分配的?

写入引用会更新基础值,但引用会打印意外的值

如何在Rust中缩短数组

什么是`&;[][..]`铁 rust 里的刻薄?

为什么我必须使用 PhantomData?在这种情况下它在做什么?

从管道读取后重置标准输入

如何在 Rust 中将函数项变成函数指针

trait 对象指针的生命周期

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

使用自定义 struct 收集 Vec

如何将参数传递给Rust 的线程?

如何在 Rust 中将 UTF-8 十六进制值转换为 char?

当我不满足特征界限时会发生什么?

有没有办法阻止 rust-analyzer 使非活动代码变暗?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题

为什么当borrow 变量发生变化时,borrow 变量不会改变?

如何阅读 HttpRequest 主体