rust 高效处理重复概念的工具之一泛型

57 阅读2分钟

工具概念

每一个编程语言都有一个高效处理重复概念的工具,rust中的工具之一就是泛型... (rust程序设计语言 191页) 例子给出的一步一步特别清晰。

1.提取重复前

fn main() {
    let number_list = vec![34,50,25,100,65];
    let mut largest = number_list[0];

    for &item in list {
        if item > largest {
            largest = item;
        }
    }
    println!("the largest number is {}", largest);
    
    let number_list = vec![102,34,6000,100,65];
    let mut largest = number_list[0];

    for &item in list {
        if item > largest {
            largest = item;
        }
    }
    println!("the largest number is {}", largest);
}

2.提取重复后

fn largest(list: &[i32]) -> i32 {
    let mut largest = list[0];
    for &item in list {
        if item > largest {
            largest = item;
        }
     }
    largest
}
fn main() {
    let number_list = vec![34,50,25,100,65];
    println!("the largest number is {}", largest(&number_list));    
    
    let number_list = vec![102,34,6000,100,65];
    println!("the largest number is {}", largest(&number_list));
}

3.不同类型提取前

fn main() {
 let number_list = vec![34,50,25,100,65];
 println!("the largest number is {}", largest(&number_list));

 let char_list = vec!['y','m','a','q'];
 println!("the largest number is {}", largest_char(&char_list));
}

fn largest(list: &[i32]) -> i32 {
    let mut largest = list[0];
    for &item in list {
        if item > largest {
            largest = item;
        }
     }
    largest
}

fn largest_char(list: &[char]) -> char {
    let mut largest = list[0];

    for &item in list {
        if item > largest {
            largest = item;
        }
     }
    largest
}

4.提取类型后


fn main() {
 let number_list = vec![34,50,25,100,65];
 println!("the largest number is {}", largest(&number_list));

 let char_list = vec!['y','m','a','q'];
 println!("the largest number is {}", largest(&char_list));

}
// :PartialOrd + Copy 按照书上操作会提示fn largest<T: std::cmp::PartialOrd>(list: &[T]) -> T {} 正常运行需要给出类型 196页也给出了具体原因
fn largest<T:PartialOrd + Copy>(list: &[T]) -> T {
    let mut largest = list[0];
    for &item in list.iter() {
        if item > largest {
            largest = item;
        }
     }
    largest
}

5.结构体泛型

struct Point<T> {
    x: T,
    y: T,
}
fn main() {
    let both_float = Point { x: 5, y:4.0 };
}
// 运行后出现问题
expected integer, found floating-point number

6.结构体泛型

fn main() {
    let both_integer = Point { x:5, y: 10 };
    let both_float = Point { x: 1.0, y:4.0 };

    println!("a{},b{}",both_integer.x,both_float.y);
}
// 当代码中需要许多泛型类型时,它可能表明代码需要重构,分解成更小的结构
struct Point<T, U> {
    x: T,
    y: U,
}

最后

都是书中的案例,学习到这边感觉demo一步一步给出来特别清晰。rust实现泛型,使得使用泛型类型参数的代码相比使用具体类型并没有任何速度上的损失。rust通过在编译时进行泛型代码的单态化来保证效率。单态化是一个通过填充编译时使用具体类型,将通用代码转换为特定代码的过程