如何正确地重新排列代码以绕过 Rust 借用检查器?

问题描述 投票:0回答:1

代码:

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()
}

我有 2 个主要编译器错误(第三个不是这种情况):

  • 借用错误
    map
  • 未实现
    Copy
    特征的错误

我从我的算法中提取了这段和平代码,意思是相同的。使用 GC 的其他语言的某种“翻译”代码可以完美编译和运行,但在这里我遇到了错误。我理解为什么会发生这些错误,但我需要我的代码以这种方式工作:在迭代期间,我将节点存储在映射中,并在下一次迭代中将其用作当前值。我真的很想知道如何让这段代码在没有其他东西的情况下工作,比如

Rc

rust borrow-checker
1个回答
1
投票

这是当前借用检查器中的一个已知限制。 Polonius 应该在任何时候接受这个代码(现在估计是 2024 年的某个时候)。

但是,基于入口的 API 无论如何都是正确的做法。它更简洁地表达了相同的操作,并且被当前的借用检查器接受:

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()
}

(游乐场)

© www.soinside.com 2019 - 2024. All rights reserved.