面试题答案
一键面试// 定义trait
trait BTrait {
fn b_method(&self);
}
// 定义结构体B,实现BTrait
struct B;
impl BTrait for B {
fn b_method(&self) {
println!("This is B's method.");
}
}
// 定义结构体A,包含B类型的引用
struct A<'a> {
b_ref: &'a B,
}
// 为结构体A实现方法,该方法调用B的方法
impl<'a> A<'a> {
fn operate_on_b(&self) {
self.b_ref.b_method();
}
}
生命周期参数'a
的作用:
在结构体A
的定义struct A<'a> { b_ref: &'a B, }
中,生命周期参数'a
表示b_ref
这个引用的生命周期。它确保了A
实例存在的整个生命周期内,b_ref
所引用的B
实例也存在。也就是说,A
实例的生命周期不能长于它所引用的B
实例的生命周期。
trait约束BTrait
的作用:
在impl BTrait for B
中,BTrait
定义了B
类型需要实现的方法b_method
。在A
的operate_on_b
方法中,通过self.b_ref.b_method()
调用B
的方法,这就要求b_ref
所引用的类型必须实现BTrait
。如果B
没有实现BTrait
,编译器会报错,从而保证了类型安全,确保A
能正确操作B
的成员。
可以通过以下方式测试上述代码:
fn main() {
let b = B;
let a = A { b_ref: &b };
a.operate_on_b();
}