gpt4 book ai didi

rust - 如何返回对已移动框内内容的引用?

转载 作者:行者123 更新时间:2023-12-03 11:45:02 25 4
gpt4 key购买 nike

我想在 map 中存储Box,并获取Box内容的地址并将其交给C代码。这就是为什么我不只是将值直接存储在 map 中的原因,因为 map 值会随着 map 的增长而移动。
我想要一个返回对Box内容的引用的函数,该函数可以在Rust代码中使用,也可以在Rust代码中按原样使用,或者将返回的引用转换为C的原始指针。
这段代码说明了我正在尝试做的事情,但是由于明显的原因,它无法正常工作。但是,我不清楚如何解决它。

use std::collections::{HashMap};

fn box_and_ref<'a>(map: &'a mut HashMap<String, Box<Vec<u8>>>) -> &'a Vec<u8> {
let v = vec!{b'h', b'e', b'l', b'l', b'o'};
let b = Box::new(v);
let r = b.as_ref();
map.insert("foo".to_string(), b);
r
}

fn main() {
let mut map: HashMap<String, Box<Vec<u8>>> = HashMap::new();

let v = box_and_ref(&mut map);
println!("{:?}", v);
}
playground link

最佳答案

对于任何“避免双重查询”问题,请使用entry API:

fn box_and_ref<'a>(map: &'a mut HashMap<String, Box<Vec<u8>>>) -> &'a Vec<u8> {
let v = vec!{b'h', b'e', b'l', b'l', b'o'};
let b = Box::new(v);
map.entry("foo".to_string()).or_insert(b)
}

关于rust - 如何返回对已移动框内内容的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63308336/

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