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 };}在这个例子中,当把整型值 5 赋值给 x 时,就告诉了编译器这个 Point<T> 实例中的泛型 T 全是整型 。接着指定 y 为浮点值 4.0,因为它y被定义为与 x 相同类型,所以将会得到一个像这样的类型不匹配错误:

文章插图
如果想要定义一个 x 和 y 可以有不同类型且仍然是泛型的 Point 结构体,我们可以使用多个泛型类型参数 。修改 Point 的定义为拥有两个泛型类型 T 和 U 。其中字段 x 是 T 类型的,而字段 y 是 U 类型的:
struct Point<T, U> {x: T,y: U,}fn main() {let both_integer = Point { x: 5, y: 10 };let both_float = Point { x: 1.0, y: 4.0 };let integer_and_float = Point { x: 5, y: 4.0 };}现在所有这些 Point 实例都合法了!我们可以在定义中使用任意多的泛型类型参数,不过太多的话,代码将难以阅读和理解 。当你发现代码中需要很多泛型时,这可能表明你的代码需要重构分解成更小的结构 。4.枚举中使用泛型和结构体类似,枚举也可以在成员中存放泛型数据类型 。例如:
enum Option<T> {Some(T),None,}Option<T> 是一个拥有泛型 T 的枚举,它有两个成员:Some,它存放了一个类型 T 的值,和不存在任何值的None 。通过 Option<T> 枚举可以表达有一个可能的值的抽象概念,同时因为 Option<T> 是泛型的,无论这个可能的值是什么类型都可以使用这个抽象 。枚举也可以拥有多个泛型类型, 例如:
enum Result<T, E> {Ok(T),Err(E),}Result 枚举有两个泛型类型,T 和 E 。Result 有两个成员:Ok,它存放一个类型 T 的值,而 Err 则存放一个类型 E 的值 。这个定义使得 Result 枚举能很方便的表达任何可能成功(返回 T 类型的值)也可能失败(返回 E 类型的值)的操作 。总结:当意识到代码中定义了多个结构体或枚举,它们不一样的地方只是其中的值的类型的时候 , 不妨通过泛型类型来避免重复 。
5.方法定义中的泛型在为结构体和枚举实现方法时, 一样也可以用泛型 。看下面的代码:
struct Point<T> {x: T,y: T,}impl<T> Point<T> {fn x(&self) -> &T {&self.x}}fn main() {let p = Point { x: 5, y: 10 };println!("p.x = {}", p.x());}这里在 Point<T> 上定义了一个叫做 x 的方法来返回字段 x 中数据的引用 。注意必须在 impl 后面声明 T , 这样就可以在 Point<T> 上实现的方法中使用 T 了 。通过在 impl 之后声明泛型 T,Rust 就知道 Point 的尖括号中的类型是泛型而不是具体类型 。我们可以为泛型参数选择一个与结构体定义中声明的泛型参数所不同的名称,不过依照惯例使用了相同的名称 。impl 中编写的方法声明了泛型类型可以定位为任何类型的实例,不管最终替换泛型类型的是何具体类型 。【在 Rust 编程中使用泛型】定义方法时也可以为泛型指定限制(constraint) 。例如 , 可以选择为 Point<f32> 实例实现方法,而不是为泛型 Point 实例 。代码如下:
impl Point<f32> {fn distance_from_origin(&self) -> f32 {(self.x.powi(2) + self.y.powi(2)).sqrt()}}这段代码意味着 Point<f32> 类型会有一个方法 distance_from_origin,而其他 T 不是 f32 类型的 Point<T> 实例则没有定义此方法 。这个方法计算点实例与坐标 (0.0, 0.0) 之间的距离,并使用了只能用于浮点型的数学运算符 。
推荐阅读
- 指针变量在C/C++中的内存占用
- 什么是Rust语言 ,特点是什么,跟其它语言对比有什么优势
- Go编程中调用外部命令的几种场景
- 搜索引擎友好型特点结构清晰、解决用户问题、内容更新快
- WPS卡住了,怎么办?
- 在 Rust 编程中使用多线程
- 只有了解关键词排名机制,才可以避免走入网站优化深渊
- 秀米该咋滴才可以上传视频,如何在秀米编辑器中上传图片
- 在哪里开失业证明?
- 男性器官衰老顺序已公开,建议对照一下,看看自己在哪个阶段?
