gpt4 book ai didi

rust - 如何结束匹配或 if let 表达式中的借用?

转载 作者:行者123 更新时间:2023-11-29 08:12:49 25 4
gpt4 key购买 nike

我正在使用 HashMap 来存储枚举。我想从 HashMap 中获取一个值,如果该值是特定的枚举变体,我想将该值的修改副本插入到 HashMap 中>.

我想出的代码是这样的:

if let Node::LeafNode(mut leaf_node) = *(self.pages.get(&page).unwrap()) {
let mut leaf_node = leaf_node.clone();
// ...
self.pages.insert(leaf_page,Node::LeafNode(leaf_node));
}

这不会编译,因为 self.pages 的借用一直持续到 if let block 和 self.pages.insert 是可变借用。

我试图用值的副本来隐藏 HashMap 的值,但这并没有结束借用。通常我会使用 {} block 来限制借用,但这在 matchif let 中似乎是不可能的。

结束借用以便获得新的可变借用的惯用方法是什么?

最佳答案

目前这是不可能的。你要的叫non-lexical borrows它尚未在 Rust 中实现。同时,你应该使用 Entry使用 map 的 API - 在大多数情况下应该足够了。在这种特殊情况下,我不确定条目是否适用,但你总是可以做类似的事情

let mut result = None;
if let Some(&Node::LeafNode(ref leaf_node)) = self.pages.get(&page) {
let mut leaf_node = leaf_node.clone();
// ...
result = Some((leaf_page, leaf_node));
}

if let Some((leaf_page, leaf_node)) = result {
self.pages.insert(leaf_page, leaf_node);
}

鉴于您没有提供 Nodeself.pages 的定义,很难使上面的代码完全正确,但它应该是大致正确的。当然,只有当 leaf_pageleaf_node 不包含对 self.pagesself 的引用时,它才会起作用,否则您将无法访问 self.pages

关于rust - 如何结束匹配或 if let 表达式中的借用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33495933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com