面试题答案
一键面试fn choose<T>(a: &'a T, b: &'a T) -> &'a T
where
'a: 'static,
{
if std::mem::discriminant(a) < std::mem::discriminant(b) {
a
} else {
b
}
}
生命周期标注解释
- 在函数签名
fn choose<T>(a: &'a T, b: &'a T) -> &'a T
中,'a
是生命周期参数。- 这里将
a
和b
的生命周期都标注为'a
,意味着它们必须至少存活到函数返回的引用的生命周期结束。 - 函数返回的引用的生命周期也为
'a
,这确保了返回的引用在其使用的上下文中,其指向的数据仍然有效。
- 这里将
- 限制
'a: 'static
确保了'a
代表的生命周期是整个程序的生命周期,这在实际应用中,适用于a
和b
所指向的数据在程序运行期间一直有效的场景,比如指向全局静态数据或者堆上分配的且在程序结束前不会释放的数据等。这样标注能确保在不同输入情况下,函数返回的引用在其被使用的整个生命周期内都是有效的,从而使函数能通过编译。