面试题答案
一键面试// 假设这是两个引用类型
struct RefType1;
struct RefType2;
struct Container<'a> {
member1: &'a RefType1,
member2: &'a RefType2,
}
impl<'a> Container<'a> {
fn get_ref(&self, condition: bool) -> &'a (dyn std::fmt::Debug + 'a) {
if condition {
self.member1 as &(dyn std::fmt::Debug + 'a)
} else {
self.member2 as &(dyn std::fmt::Debug + 'a)
}
}
}
解释:
- 结构体定义:在
Container
结构体定义时,使用泛型生命周期参数'a
来标注member1
和member2
两个成员变量的生命周期。这表明这两个引用必须拥有相同的生命周期'a
。 - 方法定义:
get_ref
方法返回一个引用,返回值的生命周期也标注为'a
,与结构体成员变量的生命周期保持一致。这是因为返回的引用要么是member1
要么是member2
,它们的生命周期都受限于'a
。 - 动态分发:由于
member1
和member2
是不同类型,为了能够返回其中任意一个,这里使用了dyn std::fmt::Debug
作为返回类型(仅为示例,实际应用中可替换为更合适的 trait)。同时,生命周期参数'a
也需要附加到dyn std::fmt::Debug
上,以表明这个动态类型对象的生命周期也是'a
。这样处理生命周期问题可以确保返回的引用在结构体Container
有效的生命周期内始终有效,避免悬空引用的问题。