根据官网的解释就是
特徵会告诉编译器特定型别与其他型别共享的功能。可以使用特徵定义来抽象出共同行为。可以使用特徵界限(trait bounds)来指定泛型型别为拥有特定行为的任意型别。
简单讲就是其他语言中的介面(interface),只是有少许不同而已
假设我们需要一个函式需计算四次平方根,可以用标准库sqrtx来写
fn main() {
fn quartic(x: f64) -> f64 {
return x.sqrt().sqrt();
}
let qr = quartic(100.);
println!("{} {}", qr * qr * qr * qr, qr);
}
输出
100.00000000000003 3.1622776601683795
但假如要还需要一个计算32位元浮点数的四次平方根又要再写一个quarticf32函式
fn quarticf64(x: f64) -> f64 {
return x.sqrt().sqrt();
}
fn quarticf32(x: f32) -> f32 {
return x.sqrt().sqrt();
}
这时候可能会写一个泛型函式来取代前面两个函式
fn main() {
fn quartic<T>(x: T) -> T {
return x.sqrt().sqrt();
}
let qrf32 = quartic(100f32);
let qrf64 = quartic(100f64);
println!("{} {}", qrf32, qrf64);
}
会出现编译错误
no method named `sqrt` found for type parameter `T` in the current scope
会出现这样的错误是因为x变数是属於泛型型别T,是刚刚在建立出来的并没有sqrt的mehtod
这时候就可以特徵派上用场的时候了,可以这样使用解决刚刚的问题
fn main() {
trait HasSqrt {
fn sq(self) -> Self;
}
impl HasSqrt for f32 {
fn sq(self) -> Self {
return f32::sqrt(self);
}
}
impl HasSqrt for f64 {
fn sq(self) -> Self {
return f64::sqrt(self);
}
}
fn quartic<T>(x: T) -> T
where
T: HasSqrt,
{
return x.sq().sq();
}
let qr32 = quartic(100f32);
let qr64 = quartic(100f64);
println!("{} {}", qr32, qr64);
}
输出
3.1622777 3.1622776601683795
一开先宣告HasSqrt trait然後使用impl关键字替f32和f64实现sq函式
<<: DAY18 Conponent Tree 的黄色警告三角型?!
嗨,我是 A Fei,来看看今天的题目: (题目来源:Codewars) Take the foll...
Controller test 主要测在 controller 的 action,基本的 CRUD ...
紧接着昨天~ 我们写了一个func 并且利用结构加入阵列的方式写入每个变数的字串以及图片。 而後在生...
前言 网路通讯协定就是为电脑进行资料交换而建立的规章或标准的集合。常用的有TCP/IP协定、HTTP...
今天来说说我看了STM32_DMA的部分 DMA(Direct Memory Access,直接存储...