Rust 如何返回对移动框中某个对象的引用?

Rust 如何返回对移动框中某个对象的引用?,rust,Rust,我想在地图中存储一个盒子,并获取盒子内容的地址,然后将其发送给C代码。这就是为什么我不直接将值存储在地图中,因为地图值在地图增长时会移动 我想要一个函数,它返回对框中内容的引用,我可以在Rust代码中使用,或者在Rust代码中按原样使用,或者将返回的引用转换为C的原始指针 这段代码说明了我试图做的事情,但由于明显的原因,它不起作用。然而,我不清楚如何修复它 use std::collections::{HashMap}; fn box_and_ref<'a>(map: &'

我想在地图中存储一个盒子,并获取盒子内容的地址,然后将其发送给C代码。这就是为什么我不直接将值存储在地图中,因为地图值在地图增长时会移动

我想要一个函数,它返回对框中内容的引用,我可以在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);
}
使用std::collections::{HashMap};
fn方框和参考号及Vec{
设v=vec!{b'h',b'e',b'l',b'l',b'o'};
设b=Box::new(v);
设r=b.as_ref();
map.insert(“foo.to_string(),b);
R
}
fn main(){
让mut映射:HashMap=HashMap::new();
设v=方框和参考(&mut映射);
println!(“{:?}”,v);
}

对于任何“避免重复查找”问题,请使用:

fn框和参考&'a向量{
设v=vec!{b'h',b'e',b'l',b'l',b'o'};
设b=Box::new(v);
map.entry(“foo.to_string())。或_insert(b)
}

Err,难道您不能用
map[“foo”]来修复当前的编译错误吗?毕竟,这是您的
框的新位置。我想是的,但现在我必须在地图中查找不必要的值。我真正想要的是我知道在那个框中的堆值的地址(指针)。我可以用不安全的方法“安全地”做这件事。这仅仅是你不得不耸耸肩,用生锈的方式来做的其中一次吗?同样因为钥匙被移动到地图中,你也需要复制钥匙(在本例中是字符串)。我将尝试使用hashmap入口API来实现这一点(我认为它仍然不稳定,但这只是在hashset上)。@Eloff大多数入口API自Rust 1.0.0以来一直保持稳定,我们现在拥有的对于这个用例来说已经足够了。这回答了问题,但是,当我试图将它应用于实际问题时,我被挫败了,因为似乎你无法引用互斥锁后面的映射中的任何内容,因为互斥锁只有在你持有锁的情况下才有效。我不知道修复方法是什么,但是我正在考虑把盒子换成一个从Box得到的原始指针:泄漏并把它称为一天。如果你借阅盒子的内容超过你的地图借阅量,想想地图掉下来会发生什么吗?该框(及其内容)也将被删除,其内存将被释放,您的引用将悬空。静态可验证的安全解决方案是在引用内容期间借用地图;运行时可验证的安全解决方案是共享所有权,例如与
Rc
。否则,您将引入编译器和运行时都无法验证的关于生命周期的保证:这就是原始指针和
不安全的
的用途。
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)
}