面试题答案
一键面试struct RefContainer<'a> {
data: &'a mut Vec<i32>
}
struct MainContainer {
sub_containers: Vec<RefContainer<'_>>
}
fn reorder_sub_containers(mut main_container: MainContainer) -> MainContainer {
main_container.sub_containers.sort_by_key(|ref_container| *ref_container.data.get(0).unwrap());
main_container
}
移动语义的作用
- 参数传递:
reorder_sub_containers
函数接收main_container
作为参数,这里main_container
的所有权被移动到函数内部。这意味着调用该函数后,调用者不再拥有main_container
的所有权。 - 返回值:函数返回
main_container
,将所有权从函数内部移动到调用者。这样确保了MainContainer
实例的所有权始终有唯一的所有者,避免了双重释放等内存安全问题。
生命周期的作用
RefContainer
的生命周期:RefContainer
结构体持有对Vec<i32>
的可变引用,其生命周期参数'a
表示该引用的生命周期。这里'_
在MainContainer
中的使用,表示编译器会自动推断这些引用的生命周期。- 排序过程中的生命周期:在排序过程中,
sort_by_key
函数会对sub_containers
中的RefContainer
进行操作。由于RefContainer
中的引用指向外部的Vec<i32>
,只要这些Vec<i32>
的生命周期长于MainContainer
实例的生命周期,并且在排序操作过程中,引用的有效性能够得到保证,就不会出现悬空引用等问题。在这个实现中,因为没有改变引用的指向或者延长/缩短其生命周期,所以内存安全能够得到保障。