面试题答案
一键面试fn add<T: std::ops::Add<Output = T>>(a: T, b: T) -> T {
a + b
}
在Rust编译时,对这个泛型函数的类型检查过程如下:
- 类型推断:当调用
add
函数时,编译器会根据传入的实际参数类型推断出泛型参数T
的具体类型。例如,如果调用add(1, 2)
,编译器会推断出T
为i32
。 - 约束检查:编译器检查泛型参数
T
是否满足std::ops::Add<Output = T>
这个约束。这意味着T
类型必须实现Add
trait,并且Add
操作的返回类型必须也是T
。对于i32
类型,Rust标准库已经为其实现了Add
trait,且返回类型也是i32
,所以符合要求。 - 单态化:一旦编译器确定了
T
的具体类型并检查通过约束,它会为该具体类型生成一份特定版本的函数代码,这个过程称为单态化。例如,对于i32
类型,编译器会生成类似于以下代码(简化示意):
fn add_i32(a: i32, b: i32) -> i32 {
a + b
}
这样,在运行时,调用add(1, 2)
实际上就是调用单态化后的add_i32
函数,保证了类型安全。通过这种方式,Rust在编译期就能确保泛型函数使用的类型安全,避免运行时类型错误。