Rust-定义泛型函式

Rust是强型别语言,执行严格的资料型别检查,因此当定义使用某种型别参数的函式时比如说

square(x: f32) -> f32

调用函式的程序码必须传递一个严格属於这种型别的表达式例如

square(1.3414f32)

或者是每次使用该函式时都执行显式的型别转换例如

square(1.3414f64 as f32)

对於使用的人非常不方便,对於编写该函式的人也不方便

由於Rust有很多数字类的型别,如果决定了参数型别是i32型别但每次调用几乎都是用i64哪最好是更改参数型别为i64,而且如果函式有多个模块或是多个程序在使用则很难满足每个调用者的需求

例如

fn f(s: char, n1: i16, n2: i16) -> i16 {
    if s == '1' {
        return n1;
    }

    return n2;
}

println!("{}", f('1', 10, 20));

输出
10

这时候想用f32当参数肯定是无法使用这函式,但总不能为了这个需求又写了逻辑一样的函式只差在参数不同,这时候就可以使用泛型函式了

定义泛型函式

fn main() {
		println!("{}", f::<i16>('1', 10, 20));
    println!("{}", f::<f32>('1', 10.1, 20.1));
}

fn f<T>(s: char, n1: T, n2: T) -> T {
    if s == '1' {
        return n1;
    }

    return n2;
}

输出
10
10.1

这个函式既可以输入i16也可以输入f32当参数了

在定义函式中,函式名之後用<>包起来字母T,该字母为函式宣告的型别参数

这个表示宣告的不是具体函式而是由T型别参数来参数化的泛型函式,只有在编译时为该T参数指定具体型别时该函式才成为具体函式

在使用泛型函式需要将T参数替换成实际使用f::的型别来护得具体函式

上面例子有三个地方宣告成T型别,在使用时需要三个都是相同型别不然在编译时会出现错误

推断参数型别

可以透过Rust的型别推断简化成下面使用范例

fn main() {
		println!("{}", f('1', 10, 20)); // 透别推断型别简化
    println!("{}", f('1', 10.1, 20.1)); // 透别推断型别简化
}

fn f<T>(s: char, n1: T, n2: T) -> T {
    if s == '1' {
        return n1;
    }

    return n2;
}

<<:  @Day27 | C# WixToolset + WPF 帅到不行的安装包 [额外的DLL引用]

>>:  Day15vue.js网站登出

Day 17 利用 helm 安装 Jenkins

利用 Helm 安装 Jenkins 安装 Go sudo apt-get install gola...

错误接受率 (FAR) 和错误拒绝率 (FRR)

-来源:(ISC)² 社区 在基於生物识别的系统中,灵敏度/阈值和 CER/EER 通常可以互换使...

用 Line LIFF APP 实现信箱验证绑定功能(1) - 取得 user email

先前提过,手动发身份认证码给使用者,再让使用手动输入验证码的流程太不友善,今天就开始着手优化这个步骤...

Day 2:Kotlin 程序设计基础入门 (1)

本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 Udemy 和 Youtu...

Day01:铁人赛开场

一、主题内容 虽然知道全端工程师的路不好走,自己目前也还不是很称职,仍想以自己转职的角度、回顾的方式...