1.为什么需要泛型

用同一功能的函数处理不同类型的数据,例如两个数的加法,无论是整数还是浮点数,甚至是自定义类型,都能进行支持。在不支持泛型的编程语言中,通常需要为每一种类型编写一个函数:
  1. fn add_i8(a:i8, b:i8) -> i8 {
  2. a + b
  3. }
  4. fn add_i32(a:i32, b:i32) -> i32 {
  5. a + b
  6. }
  7. fn add_f64(a:f64, b:f64) -> f64 {
  8. a + b
  9. }
  10. fn main() {
  11. println!("add i8: {}", add_i8(2i8, 3i8));
  12. println!("add i32: {}", add_i32(20, 30));
  13. println!("add f64: {}", add_f64(1.23, 1.23));
  14. }

使用泛型

  1. fn add<T>(a:T, b:T) -> T { //这里是不可运行的,T就代表泛型,需要配合trait才能运行
  2. a + b
  3. }
  4. fn main() {
  5. println!("add i8: {}", add(2i8, 3i8));
  6. println!("add i32: {}", add(20, 30));
  7. println!("add f64: {}", add(1.23, 1.23));
  8. }
Rust 通过在编译时进行泛型代码的 单态化(monomorphization)来保证效率。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。 所以只会 消耗代码编译速度,不会影响代码运行速度。 后续的需要配合Trait使用