Rust-特徵(Trait)(一)

什麽是特徵

根据官网的解释就是

特徵会告诉编译器特定型别与其他型别共享的功能。可以使用特徵定义来抽象出共同行为。可以使用特徵界限(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 的黄色警告三角型?!

>>:  Day19 样式变化(动画3) CSS转换

欢迎进入 ip 的世界,Ruby 30 天刷题修行篇第十五话

嗨,我是 A Fei,来看看今天的题目: (题目来源:Codewars) Take the foll...

Day13 测试写起乃 - controller test

Controller test 主要测在 controller 的 action,基本的 CRUD ...

Day10 Collectionview小实作4

紧接着昨天~ 我们写了一个func 并且利用结构加入阵列的方式写入每个变数的字串以及图片。 而後在生...

Day 21网路通讯协定

前言 网路通讯协定就是为电脑进行资料交换而建立的规章或标准的集合。常用的有TCP/IP协定、HTTP...

[DAY 24] _DMA简介

今天来说说我看了STM32_DMA的部分 DMA(Direct Memory Access,直接存储...