如何将Box的Vector转换为参考的Vector?
How to convert Vector of Box to Vector of reference?
我正在寻找将 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
才能获得后者。
我正在寻找将 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
才能获得后者。