面试题答案
一键面试-
设计思路
- 泛型约束:因为结构体中的对象都实现了一个特定的trait,所以在函数定义中,泛型参数需要约束为实现这个特定trait。
- 引用的使用:为了避免所有权转移,函数参数采用引用的方式。由于可能需要修改结构体成员,所以使用可变引用。
- 处理借用规则冲突:Rust的借用规则要求在同一时间,要么只能有一个可变引用(用于修改),要么可以有多个不可变引用(用于读取)。在函数内部,确保对结构体成员的修改操作不会违反这个规则。
-
代码示例
// 定义一个trait
trait SpecificTrait {
fn perform_action(&mut self);
}
// 定义不同类型的结构体,都实现SpecificTrait
struct TypeA {
value: i32,
}
impl SpecificTrait for TypeA {
fn perform_action(&mut self) {
self.value += 1;
}
}
struct TypeB {
text: String,
}
impl SpecificTrait for TypeB {
fn perform_action(&mut self) {
self.text.push_str(" modified");
}
}
// 包含多种不同类型对象的结构体
struct Container<T: SpecificTrait> {
data: T,
}
// 定义函数
fn process_container<T: SpecificTrait>(container: &mut Container<T>) {
container.data.perform_action();
}
fn main() {
let mut container_a = Container { data: TypeA { value: 10 } };
let mut container_b = Container { data: TypeB { text: "original".to_string() } };
process_container(&mut container_a);
process_container(&mut container_b);
println!("TypeA value: {}", container_a.data.value);
println!("TypeB text: {}", container_b.data.text);
}
在上述代码中:
- 首先定义了
SpecificTrait
,它有一个方法perform_action
。 TypeA
和TypeB
结构体都实现了SpecificTrait
。Container
结构体是一个泛型结构体,其泛型参数T
受限于实现SpecificTrait
。process_container
函数以可变引用的方式接受Container
结构体,并调用其中对象的perform_action
方法,实现对不同类型对象的不同操作。- 在
main
函数中,创建了不同类型的Container
实例,并调用process_container
函数对其进行处理。