面试题答案
一键面试fn slice_array(arr: &[i32]) -> &[i32] {
&arr[1..3]
}
fn main() {
let original = [1, 2, 3, 4, 5];
let result = slice_array(&original);
println!("{:?}", result);
}
- 借用规则:
- Rust的借用检查器遵循三条主要规则:
- 同一时间内,要么只能有一个可变引用(写操作),要么只能有多个不可变引用(读操作)。
- 引用必须总是有效的。
- Rust的借用检查器遵循三条主要规则:
- 代码分析:
- 在
slice_array
函数中,参数arr
是对[i32]
数组的不可变引用。 - 当返回
&arr[1..3]
时,借用检查器确保返回的切片的生命周期不会超过arr
的生命周期。因为arr
是函数参数,它的生命周期由调用者决定。 - 在
main
函数中,original
数组创建在栈上,当调用slice_array(&original)
时,original
的引用被传递给函数。返回的切片result
的生命周期依赖于original
,只要original
存在,result
就是有效的。 - 如果在函数内尝试对
arr
进行可变操作同时又返回切片,借用检查器会报错,因为这违反了借用规则(同时存在可变和不可变引用)。例如:
- 在
fn slice_array(arr: &[i32]) -> &[i32] {
// 以下代码会报错,因为尝试对不可变引用进行可变操作
let mut new_arr = arr.to_vec();
new_arr.push(6);
&new_arr[1..3]
}
这个修改后的代码会报错,因为 arr
是不可变引用,不能转换为可变的 new_arr
同时还返回切片。借用检查器通过这些规则确保了数组底层存储的有效性和生命周期的正确性。