vector - 如何将盒子向量转换为引用向量?

标签 vector rust reference boxing

我正在寻找一种沟通方式 Vec<Box<u32>>Vec<&u32> 。这是我尝试过的:

fn conver_to_ref(){
    let test: Vec<Box<u32>> = vec![Box::new(1), Box::new(2)];
    let _test2: Vec<&u32> = test.into_iter().map(|elem| &*elem).collect();
}

不幸的是它无法编译:demo 。错误信息:

error[E0515]: cannot return reference to local data `*elem`
 --> src/lib.rs:3:57
  |
3 |     let _test2: Vec<&u32> = test.into_iter().map(|elem| &*elem).collect();
  |                                                         ^^^^^^ returns a reference to data owned by the current function

如何进行这样的转换?

最佳答案

into_iter()消耗原始向量及其项目。如果代码按编写方式编译,则 _test2 中的所有引用会悬空,因为盒子会与 test 一起被摧毁。 .

可以构建引用向量,但您不需要消耗原始的 test向量,以便盒子保留所有者。您可以简单地使用iter()而不是into_iter() :

fn convert_to_ref() {
    let test: Vec<Box<u32>> = vec![Box::new(1), Box::new(2)];
    let _test2: Vec<&u32> = test.iter().map(Box::as_ref).collect();
}

请注意test.iter()产生对 test 的引用元素,即盒子本身( &Box<u32> ),而不是我们感兴趣的装箱项目( &u32 )。这就是为什么我们必须应用 as_ref 。得到后者。

关于vector - 如何将盒子向量转换为引用向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63525018/

相关文章:

c++ - 有没有办法在 C++ 中预先声明嵌套类?

c++ - 如何在映射 C++ 中存储/访问同一键的多个值

string - 使用 malloced 字符串创建 Rust 字符串是否安全?

c++ - 在C++中采用输入行并将行中的单词添加到 vector 的最佳方法是什么?

rust - 如何从对象安全特征对象中移出一个值?

rust - 我如何告诉 Rust 去哪里寻找静态库?

c++ - 传递大物体的最快方法

java - HashCode和equals对对象实例化的影响

c++ - 有什么方法可以为函数指定一个通用参数,并限制它应该实现给定的接口(interface)

r - 将元素添加到 R 中向量的开头