当前位置: 首页 > news >正文

Rust语言开发基础(八)Rust的接口及其实现

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

trait(特征)类似于其他语言中的interface或者protocol,指定一个实际类型必须满足的功能集合

一、如何理解trait,可以从我们所了解的接口特性去推断trait的用法

1. 那么作为一个类接口的关键字,意味着被它修饰的类不包含实现的方法fn,只定义函数名称和参数,由这个类的实现类去完成它的方法。
2. 任何实现接口的类都必须去实现接口的方法,这种特性恰好可以作为一种从上到下的约束,应用到Rust语法里面。
3. 接口也可以不断被继承,最后实现类须要实现所有的接口里的方法。

 

二、trai的实现方式

1. 定义接口

trait HasArea {
    fn area(&self) ->f64;
}

 

2. 实现接口

为一个结构体圆增加一个计算圆面积的函数:

struct Circle {
    x:f64,
    y:f64,
    radius:f64,
}

impl HasAreaforCircle {
    fn area(&self) ->f64 {
        std::f64::consts::PI* (self.radius *self.radius)
    }
}

----------------------------------------------------------

fn main() {
    let c =Circle {
        x:0.0f64,
        y:0.0f64,
        radius:1.0f64,
    };
    println!("circle c has an area of {}", c.area());
}


最终输出:
circle c has an area of 1


3. 继承接口
trait Foo {
    fn foo(&self);
}

trait FooBar:Foo {
    fn foobar(&self);
}
实现:
struct Baz;

impl FooforBaz {
    fnfoo(&self) { println!("foo"); }
}

impl FooBarforBaz {
    fn foobar(&self) { println!("foobar"); }
}

 

4.自动化实现接口
Rust会自动帮你实现接口,当然必须是某些特定的接口方法,就好像利用开发工具帮你实现一些接口方法一样。
能帮你实现的方法仅限于:Clone,Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd
这些方法一般是常见的方法,要自动实现上述方法,前提是使用derive属性。

#[derive(Debug)]structFoo;

fn main() {
    println!("{:?}",Foo);
}

5.自带默认方法
tait修饰的类都自动被系统加上一个默认方法,这个默认方法不要求被实现类实现,当然实现类可以去实现它并覆盖原有方法。

trait Foo {
    fn is_valid(&self) ->bool;

    fn is_invalid(&self) ->bool { !self.is_valid() }
}
is_invalid是默认方法,Foo的实现者并不要求实现它,如果选择实现它,会覆盖掉它的默认行为。

 

三、Rust里面的应用场景

1.给泛型增加约束,或者说给泛型增加实现要求。
例如:Debug是Rust内置的一个trait,为"{:?}"实现打印内容,函数foo接受一个泛型作为参数,并且约定其需要实现Debug
use std::fmt::Debug;

fn foo<T:Debug>(s:T) {
    println!("{:?}", s);
}


2.给泛型增加多个trait,也即所谓的多重约束。

use std::fmt::Debug;

fn foo<T:Debug+Clone>(s:T) {
    s.clone();
    println!("{:?}", s);
}
<T: Debug + Clone>中Debug和Clone使用+连接,表示泛型T需要同时实现这两个trait。

 

3. where关键字其实只是为多重约束增加一些写法。

标准写法:
use std::fmt::Debug;

fn foo<T:Clone,K:Clone+Debug>(x:T, y:K) {
    x.clone();
    y.clone();
    println!("{:?}", y);
}
where从句写法一:
fn foo<T,K>(x:T, y:K) whereT:Clone,K:Clone+Debug {
    x.clone();
    y.clone();
    println!("{:?}", y);
}
where从句写法二:
fn foo<T,K>(x:T, y:K)
    whereT:Clone,K:Clone+Debug {
    x.clone();
    y.clone();
    println!("{:?}", y);
}
语法糖,这只是语法糖!

 

4.孤僻的应用场景,给内置类型增加trait

trait HasArea {
    fn area(&self) ->f64;
}

impl HasAreafori32 {
    fn area(&self) ->f64 {
        *selfasf64
    }
}

area();


最后的输出接口f64类型的数值,这个方法相当有用

注意:
1. 当你为某类型实现某 trait 的时候,必须要求类型或者 trait 至少有一个是在当前 crate 类库中定义的。你不能为第三方的类型实现第三方的 trait 。
2. 在调用 trait 中定义的方法的时候,一定要记得让这个 trait 可被访问。

 

参考:https://github.com/rustcc/RustPrimer/blob/master/10-trait/10-00-overview.md

 

 

 

 


 

转载于:https://my.oschina.net/pagecorrect/blog/655924

相关文章:

  • Flask 源码流程,上下文管理
  • ThoughtWorks 2016年第1期DNA活动总结
  • Android开发者之——做一个能服务自己的东西,好不好看都不重要
  • 软件事务内存导论(三)用Akka/Multiverse STM实现并发
  • 本地jar安装到maven仓库 和 ivy仓库方法
  • XUL 用户界面语言介绍
  • Reddit引入Envoy支持架构改造,性能显著提升
  • 弄懂Favicon
  • 基于django的视频点播网站开发-step15-项目部署
  • php任务队列
  • OpsRamp推出以服务为中心的AIOps和云监控功能
  • C# 如何在Excel 动态生成PivotTable
  • 08.Android之View事件问题
  • .naturalWidth 和naturalHeight属性,
  • 数据模型
  • Bootstrap JS插件Alert源码分析
  • Brief introduction of how to 'Call, Apply and Bind'
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • JavaScript 奇技淫巧
  • js作用域和this的理解
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python学习笔记 字符串拼接
  • socket.io+express实现聊天室的思考(三)
  • TypeScript迭代器
  • V4L2视频输入框架概述
  • vue自定义指令实现v-tap插件
  • 前嗅ForeSpider采集配置界面介绍
  • 微信小程序设置上一页数据
  • 协程
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​ssh免密码登录设置及问题总结
  • #define
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (1)常见O(n^2)排序算法解析
  • (C++17) std算法之执行策略 execution
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)平衡树
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net framework profiles /.net framework 配置
  • .NET NPOI导出Excel详解
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net6 webapi log4net完整配置使用流程
  • .NET成年了,然后呢?
  • .NET文档生成工具ADB使用图文教程
  • @Builder用法
  • @private @protected @public
  • @RestControllerAdvice异常统一处理类失效原因
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成