面试题答案
一键面试use std::fmt::Debug;
fn print_debug<T: Debug>(arg: T) {
println!("{:?}", arg);
}
struct A {
data: i32,
}
struct B {
value: String,
}
impl Debug for A {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("A")
.field("data", &self.data)
.finish()
}
}
impl Debug for B {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("B")
.field("value", &self.value)
.finish()
}
}
在Rust中,正确指定参数类型以及相关的trait约束对于函数的泛型编程和代码复用非常关键,原因如下:
- 类型安全:通过指定trait约束,编译器可以在编译时确保传入的参数类型实现了所需的功能。例如上述代码中,
print_debug
函数要求参数T
必须实现Debug
trait,这样在调用println!("{:?}", arg);
时,编译器能确定arg
类型具备格式化输出调试信息的能力,从而保证了类型安全。 - 代码复用:泛型函数配合trait约束,可以接受多种不同类型但都满足特定trait的参数。就像
print_debug
函数既可以接受A
类型的实例,也可以接受B
类型的实例,大大提高了代码的复用性。如果没有trait约束,我们可能需要针对每个类型编写重复的函数来实现相同的功能,这显然不利于代码的维护和扩展。
可以这样使用上述函数:
fn main() {
let a = A { data: 42 };
let b = B { value: "hello".to_string() };
print_debug(a);
print_debug(b);
}