gpt4 book ai didi

rust - 防 rust 传递箱引用,无动

转载 作者:行者123 更新时间:2023-12-03 11:48:32 28 4
gpt4 key购买 nike

背景:

我正在编写rust的RDBMS

db.catalog维护一个从table_id到table的哈希表:

pub struct Catalog {
table_id_table_map: HashMap<i32, Box<dyn Table>>,
}

当我将装箱的表添加到目录中时,发生了移动。然后,我不能再使用表实例:

// create table
let table = create_random_heap_table(....);
// add to catalog
db.get_catalog().add_table(Box::new(table), "heap table", "");
// access table instance
let table_id = table.get_id();

编译错误:
error[E0382]: borrow of moved value: `table`
--> src/lib.rs:113:32
|
103 | let table = create_random_heap_table(
| ----- move occurs because `table` has type `table::HeapTable`, which does not implement the `Copy` trait
...
111 | db.get_catalog().add_table(Box::new(table), "heap table", "");
| ----- value moved here
112 |
113 | let table_id = table.get_id();
| ^^^^^ value borrowed here after move

最佳答案

一旦您的Catalog拥有了该表的所有权,就可以通过引用对其进行访问。

如果您描述的用例很常见,也许您可​​以调整add_table方法以返回对刚刚添加的表的引用。
HashMap提供 Entry API作为符合人体工程学的方法,例如,您的add_table可能看起来像这样:

fn add_table(&mut self, table: Box<dyn Table>/*, ... other arguments */) -> &mut Box<dyn Table> {

let id = // figure out id somehow

// Insert table into catalog and return a reference to it
self.table_id_table_map.entry(id).or_insert(table)
}

在那个简化的示例中,我没有考虑如果 map 已经具有给定 id的条目会发生什么情况-如果逻辑上需要,您可以使用类似的模式来检查它。

现在您可以像这样使用它:
// create table
let table = create_random_heap_table(....);
// add to catalog
let table = db.get_catalog().add_table(Box::new(table), "heap table", "");
// access table instance
let table_id = table.get_id();

关于rust - 防 rust 传递箱引用,无动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62273711/

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