在Rust编程中使用泛型

1.摘要

Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以用于多种不同的具体数据类型。下面的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。

2.在函数定义中使用泛型

当使用泛型定义函数时,本来在函数签名中指定参数和返回值的类型的地方,会改用泛型来表示。采用这种技术,使得代码适应性更强,从而为函数的调用者提供更多的功能,同时也避免了代码的重复。

看下面的代码例子, 定义了两个函数, 功能都差不多,作用是分别寻找slice中最大的i32和slice中最大的char, 只是数据类型不同。

fn largest_i32(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
}
​
fn main() {
    let number_list = vec![34, 50, 25, 100, 65];
​
    let result = largest_i32(&number_list);
    println!("The largest number is {}", result);
​
    let char_list = vec!['y', 'm', 'a', 'q'];
​
    let result = largest_char(&char_list);
    println!("The largest char is {}", result);
}

编译一下代码, 输出如下:

我们现在需要定义一个新函数, 引进泛型参数来消除这种因数据类型不同而导致的函数重复定义。为了参数化这个新函数中的这些类型,我们需要为类型参数命名,道理和给函数的形参起名一样。任何标识符都可以作为类型参数的名字。这里选用 T,因为传统上来说,Rust 的类型参数名字都比较短,通常仅为一个字母,同时,Rust 类型名的命名规范是首字母大写驼峰式命名法(UpperCamelCase)。T 作为 “type” 的缩写是大部分 Rust 程序员的首选。

如果要在函数体中使用参数,就必须在函数签名中声明它的名字,好让编译器知道这个名字指代的是什么。同理,当在函数签名中使用一个类型参数时,必须在使用它之前就声明它。为了定义泛型版本的 largest 函数,类型参数声明位于函数名称与参数列表中间的尖括号 <> 中,像这样:

fn largest<T>(list: &[T]) -> &T {
  
  

可以这样理解这个定义:函数 largest 有泛型类型 T。它有个参数 list,其类型是元素为 T 的 slice。largest 函数会返回一个与 T 相同类型的引用。

按照这个思想, 我们将代码改造如下:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制空间安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值