面试题答案
一键面试fn get_second_last(vec: &Vec<i32>) -> Option<&i32> {
let len = vec.len();
if len < 2 {
return None;
}
let index = (len.checked_sub(1)?).checked_sub(1)?;
vec.get(index)
}
安全性阐述
checked_sub
:在计算倒数第二个元素的索引时,len.checked_sub(1)
首先计算倒数第一个元素的索引。如果len
为0
,checked_sub
会返回None
,这意味着索引计算失败,从而函数直接返回None
,避免了越界访问。同样,(len.checked_sub(1)?).checked_sub(1)
确保在获取倒数第二个元素的索引时,如果len
小于2
,也会返回None
,进而函数返回None
,保障了安全性。get
:vec.get(index)
使用get
方法来获取元素,get
方法会在索引越界时返回None
,而不是像vec[index]
那样导致程序 panic,这进一步确保了代码在处理可能越界的索引时的安全性。
如果使用 try_into
,可以这样实现:
fn get_second_last(vec: &Vec<i32>) -> Option<&i32> {
let len = vec.len();
if len < 2 {
return None;
}
let index: usize = (len - 2).try_into().ok()?;
vec.get(index)
}
安全性阐述
try_into
:(len - 2).try_into()
将len - 2
的结果尝试转换为usize
类型。如果len - 2
是负数(即len
小于2
),try_into
会返回Err
,ok()
将其转换为None
,函数返回None
,避免了越界风险。同样,后续的vec.get(index)
进一步保障了安全性。