面试题答案
一键面试实现思路
- 泛型与Trait Bounds:使用泛型来处理不同类型的参数。通过Trait bounds 约束泛型类型,确保所有传入的参数类型都实现了特定的Trait。这样可以在编译时检查类型安全性。
- 避免不必要的内存分配和拷贝:尽量使用引用传递参数,而不是值传递,这样可以避免不必要的拷贝。对于需要所有权转移的情况,合理使用
move
语义。
代码实现
// 定义一个Trait,所有传入的参数类型都需要实现这个Trait
trait MyTrait {
fn do_something(&self);
}
// 定义接受可变数量参数的函数
fn process_args<T: MyTrait>(args: &[&T]) {
for arg in args {
arg.do_something();
}
}
// 示例结构体1,实现MyTrait
struct Example1;
impl MyTrait for Example1 {
fn do_something(&self) {
println!("Example1 is doing something.");
}
}
// 示例结构体2,实现MyTrait
struct Example2;
impl MyTrait for Example2 {
fn do_something(&self) {
println!("Example2 is doing something.");
}
}
fn main() {
let ex1 = Example1;
let ex2 = Example2;
process_args(&[&ex1, &ex2]);
}
在上述代码中:
- 定义了一个
MyTrait
,所有参数类型都需要实现这个Trait。 process_args
函数接受一个切片,切片中的元素是对实现了MyTrait
的类型的引用,这样避免了不必要的内存分配和拷贝。- 定义了两个示例结构体
Example1
和Example2
,并为它们实现了MyTrait
。 - 在
main
函数中创建了这两个结构体的实例,并将它们的引用传递给process_args
函数进行处理。