MST

星途 面试题库

面试题:Rust类型系统中的生命周期与泛型

在Rust中,生命周期和泛型经常一起使用。请实现一个函数,该函数接受两个不同类型且带有生命周期参数的引用,并返回其中一个引用。同时,要正确标注生命周期参数,确保函数在不同输入情况下都能通过编译,并解释为什么这样标注生命周期。
40.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
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
    }
}

生命周期标注解释

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