Rust trait

Rust中的trait类似于Java中的接口,定义了一组可以被类型选择实现的“契约”或共享行为,。

特征定义:

trait Playable{
fn play(&self);
fn pause(){
println!("Paused");
}
}

上述是一个简单trait定义,提供了两个方法,一个用于提供播放功能,一个用于提供暂停功能。

实现trait:

struct Audio(String);
struct Vedio(String);
impl Playable for Audio {
fn play(&self) {
println!("Audio play");
}
}
impl Playable for Vedio {
fn play(&self) {
println!("Vedio play");
}
}

上述用两个结构体Audio和Vedio分别实现了Playable接口

或许你已经注意到我们只实现了一个play方法,并没有在“实现”pause方法,其实他们是不同的两种方法。

trait方法

trait中可以有两种方法:

关联方法:

类似于Java中的静态方法,可以直接类型调用

实例方法:

以self/&self/&mut self作为第一个参数的方法,如果没有默认实现需要实现者提供实现,通过实例变量调用

调用trait方法:

fn main() {
let audio=Audio(String::from("audio"));
audio.play();
Audio::pause();
let vedio=Vedio(String::from("vedio"));
vedio.play();
Vedio::pause();
}

输出结果:

Audio play
Paused
Vedio play
Paused

当然,我们也可以重新实现关联方法:

impl Playable for Audio {
fn play(&self) {
println!("Audio play");
} fn pause(){
println!("Audio Paused");
}
}

调用部分代码不变,结果如下:

Audio play
Audio Paused
Vedio play
Paused

trait 分类

标记特征

在std::marker模块定义的特征被称为标记特征,这种特征不包含任何方法,声明时只是提供特征名称和{},例如标准库提供的Copy,Send,Sync

泛型特征

特征也可以是泛型的:

pub trait From<T> {
fn from(t:T)->Self;
}

实现:

#[derive(Copy,Clone)]
struct A(i32);
impl From<String> for A{
fn from(t:String)->Self {
A(t.len() as i32)
}
}

介绍泛型时再具体讲解

关联类型特征
trait Foo{
type Out;
fn get_value(self)->Self::Out;
}

这提供了一种比泛型特征更好的选择,因为可以在特征中声明相关类型而不用使用泛型签名

这里Out由实现trait实现时指定,Self是具体实现类型的别名,Self::Out是关联类型Out的类型,下面是关联类型trait的一个实现:

#[derive(Copy,Clone)]
struct A(i32);
impl Foo for A {
type Out = i32; fn get_value(self)->Self::Out {
self.0
}
}
继承特征

特征也可以在声明中表明它们依赖于其他特征,这被叫做特征继承。

举例:

trait Vehicle{
fn get_price(&self)->u64;
}
trait Car:Vehicle{
fn model(&self)->String;
}

trait Car 的声明表示它需要依赖trait Vehicle,下面我们来实现它们看看会发生什么:

struct TeslaRoadster{
modle:String,
release_date:u16,
}
impl Car for TeslaRoadster {
fn model(&self)->String {
todo!()
}
}

这乍一看好像没什么错,但是编译会报如下错误:

显而易见,这表明我们要实现Car的前提是先实现它的依赖trait,即Vehicle,按照编译器提示作出修改:

struct TeslaRoadster{
modle:String,
release_date:u16,
}
impl Vehicle for TeslaRoadster {
fn get_price(&self)->u64 {
todo!()
}
}
impl Car for TeslaRoadster {
fn model(&self)->String {
todo!()
}
}

这样就满足了特征继承的要求

需要注意的是这里的特征继承只是一个习惯性叫法,只是对特征的实现作出了约束,实现一个trait必须要实现它所依赖的trait,更多的是组合的概念,特斯拉是车子,首先他得有轮子属性

Rust trait的更多相关文章

  1. 实践解析丨Rust 内置 trait:PartialEq 和 Eq

    摘要:Rust 在很多地方使用了 traits, 从非常浅显的操作符重载, 到 Send, Sync 这种非常微妙的特性. Rust 在很多地方使用了 traits, 从非常浅显的操作符重载, 到 S ...

  2. Rust 内置 trait :PartialEq 和 Eq

    GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区: https://bbs.huaweicloud.com/ ...

  3. Rust中的Trait

    类似接口,但和php中的trait又有点不一样. pub trait Summary { fn summarize(&self) -> String; } pub struct NewA ...

  4. Rust <8>:lifetime 高级语法与 trait 关联绑定

    一.生命周期关联:如下声明表示,'s >= 'c struct Parser<'c, 's: 'c> { context: &'c Context<'s>, } ...

  5. Rust的Drop Trait,相当于析构代码

    退出前自动执行的代码. struct CustomSmartPointer { data: String, } impl Drop for CustomSmartPointer { fn drop(& ...

  6. Rust语言的多线程编程

    我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...

  7. Rust 中的继承与代码复用

    在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结点的Node类和一个Sprit ...

  8. Rust 学习 0

    安装Rust 后,本地有文档: file:///usr/local/share/doc/rust/html/index.html file:///usr/local/share/doc/rust/ht ...

  9. MIPS台OpenWrt在系统内的路由器Rust应用程序开发

    笔者:Liigo(庄小莉) 迄今:2014年9一个月17日本 (9一个月29日更新,11一个月19日本再次更新.在最后可用更新) 原文链接:http://blog.csdn.net/liigo/art ...

随机推荐

  1. MyBatis-Plus日常工作学习

    一:Mybatis-Plus概述 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis ...

  2. Java第三章基础学习课后题练习

    小结:final 类型 变量名 = 数值 定义常量使用 变量的原则*** 一定要"先声明,后使用",变量使用前必须先声明.这点就没php好玩:两种键盘输入方式InputStream ...

  3. IDEA创建XML文件没有Spring Config选项

    我在resources目录下导入3个配置文件时,applicationContext-common.xml文件中有4处http地址红色报错,下图为修正后的图片 了解到可能是由于父工程的pom文件中没有 ...

  4. 看了这篇还不会Linux性能分析和优化,你来打我

    前言 一般互联网的项目都是部署在linux服务器上的,如果linux服务器出了问题,那么咱们平时学习的高并发,稳定性之类的是没有任何意义的,所以对linux性能的把握就显得非常重要,当然很多同学可能觉 ...

  5. Python 使用xlsxwriter绘制Excel表格

    最近在统计资产,正好看到了xlsxwriter这个表格生成模块,借此机会,熟悉一下,写点有趣的小案例,一开始想使用C++ QT图形化开发一套自动化运维平台,但后来发现不仅消耗时间而且需要解决QT Qs ...

  6. Python中数据的排序

    目录 列表的排序 sort(key,reverse)方法 sorted(target,key,reverse) 函数 元组tuple的排序 sort(key,reverse)方法 sorted(tar ...

  7. POJ3233不错的矩阵(矩阵套矩阵)

    题意:        给一个n*n的矩阵A,然后求S=A + A^2 + A^3 + ..+ A^k. 思路:       矩阵快速幂,这个题目挺新颖的,以往的矩阵快速幂都是退出公式,然后构造矩阵,这 ...

  8. MS06-040漏洞研究(上)【转载】

    课程简介 我在之前的课程中讨论过W32Dasm这款软件中的漏洞分析与利用的方法,由于使用该软件的人群毕竟是小众群体,因此该漏洞的危害相对来说还是比较小的.但是如果漏洞出现在Windows系统中,那么情 ...

  9. Intel汇编程序设计-整数算术指令(上)

    第七章 整数算术指令 7.1 简介 每种汇编语言都有进行操作数移位的指令,移位和循环移位指令在控制硬件设备.加密数据,以及实现高速的图形操作时特别有用.本章讲述如何进行移位和循环移位操作以及如何使用移 ...

  10. (CV学习笔记)看图说话(Image Captioning)-1

    Background 分别使用CNN和LSTM对图像和文字进行处理: 将两个神经网络结合: 应用领域 图像搜索 安全 鉴黄 涉猎知识 数字图像处理 图像读取 图像缩放 图像数据纬度变换 自然语言处理 ...