泛型声明
泛型声明
泛型函数
use std::ops::Add;
fn add<T: Add<T, Output=T>>(a:T, b:T) -> T {
a + b
}
fn main() {
println!("{}", add(100i32, 1i32));
println!("{}", add(100.11f32, 100.22f32));
}
add>(a:T, b:T) -> T
就是我们泛型函数,返回值也是泛型 T,Add<>中的含义可以暂时忽略,大体意思就是只要参数类型实现了 Add trait,就可以被传入到我们的 add 函数,因为我们的 add 函数中有相加+操作,所以要求传进来的参数类型必须是可相加的,也就是必须实现了 Add trait(具体参考 std::ops::Add)。
结构体定义中的泛型
同样也可以使用 <> 语法来定义拥有一个或多个泛型参数类型字段的结构体。下例展示了如何定义和使用一个可以存放任何类型的 x 和 y 坐标值的结构体 Point:
struct Point<T> {
x: T,
y: T,
}
fn main() {
let integer = Point { x: 5, y: 10 };
let float = Point { x: 1.0, y: 4.0 };
}
其语法类似于函数定义中使用泛型。首先,必须在结构体名称后面的尖括号中声明泛型参数的名称。接着在结构体定义中可以指定具体数据类型的位置使用泛型类型。注意 Point<T>
的定义中只使用了一个泛型类型,这个定义表明结构体 Point<T>
对于一些类型 T 是泛型的,而且字段 x 和 y 都是 相同类型的,无论它具体是何类型。如果尝试创建一个有不同类型值的 Point<T>
的实例就无法编译:
struct Point<T> {
x: T,
y: T,
}
fn main() {
let wont_work = Point { x: 5, y: 4.0 };
}
error[E0308]: mismatched types
--> src/main.rs:7:38
|
7 | let wont_work = Point { x: 5, y: 4.0 };
| ^^^ expected integer, found
floating-point number
|
= note: expected type `{integer}`
found type `{float}`
当把整型值 5 赋值给 x 时,就告诉了编译器这个 Point