为了一个函数可以接收与处理多种可能的输入类型,Rust引入的泛型类型。
在处理匹配多种类型,又使用了trait功能,在输入时核对能否支持传入函数的操作。
作者给出了如下的函数:
use std::ops::{Add};
use std::time::{Duration};
fn add<T: Add<Output = T>>(i: T, j: T) -> T {
i + j
}
fn main() {
let floats = add(1.2 , 3.4);
let ints = add(10,20);
let durations = add(
Duration::new(5,0),
Duration::new(10, 0)
);
println!("{}",floats);
println!("{}", ints);
println!("{:?}", durations);
}
在头部从std::ops中导入Add这个trait到当前的局部作用域。
从std::time 中导入Duration类型到当前局部作用域中。
从上面的例子中,函数签名变得非复杂,要读懂这些复杂的函数签名,需要一些耐心。作者给出了下面的原则:
1、小写字母(例如i、j)表示变量。
2、单个大写字母(例如T)表示泛型类型。
3、以大写字母开头的(例如Add)是trait的名字或者是具体类型的名字,比如String、Duration。
4、标签(例如'a)表示生命周期参数。
到了这里,其实在Rust的安全性下,对编程者需要有很扎实的基本功,要不读代码都非常吃力呀。
加油、努力学习中!