`

rust trait

    博客分类:
  • rust
 
阅读更多
使用trait可以让不用的类型实现同一个行为,定义函数的默认实现.接口抽象,OOP范式抽象,函数式范式抽象均基于trait来完成.同时trait也保证了这些抽象几乎都是运行时零开销.

Rust一共提供了5个trait,都被定义在标准std::marker模块中.它们分别是
1.Sized trait:用来标识编译期中确定大小的类型
2.Unsized trait:实验特性?用来标识动态大小类型(DST)
3.Copy trait:用来标识可以按位复制其值的类型
#[derive(Copy,Clone)]
struct MyStruct;

4.Send trait:用来标识可以跨线程安全通信的类型,可以安全地在线程间传递值,也就是说可以跨线程传递所有权
5.Sync trait:用来标识可以在线程间共享引用的类型

Rust中冒号代表集合的"包含于"关系,而加号则代表交集
impl<T:A+B> C for T,为所有T(属于A和B的交集)实现Trait C

struct Person{
    name :&'static str,
    age:i32,
}

use std::fmt::*;
impl Debug for Person{
    fn fmt(&self,f:&mut Formatter) -> Result{
        write!(f," {{ name:{},age:{} }}",self.name,self.age)
    }
}

fn testTrait(){
    let p = Person{name:&"zs",age:20};
    println!("person:{:?}",p)
}

person: { name:zs,age:20 }


给i32实现Add
trait Add<T,Output> {
    fn add(self,t:T) -> Output;
}

impl Add<i32,i32> for i32{
    fn add(self,t:i32) -> i32{
        self + t
    }
}

impl Add<i32,u32> for u32{
    fn add(self,i:i32)-> u32{
        self + (i) as u32
    }
}

fn main() {
    let a:i32 = 1;
    let s = a.add(3);
    let u:u32 = 2;
    let s2 = u.add(4);
}


一个结构体实现2个trait
trait Page{
    fn set_page(&self,p:i32){
        println!("Page Default:{}",p);
    }
}

trait PerPage{
    fn set_perpage(&self,num:i32){
        println!("Per Page:{}",num);
    }
}

struct MyPage{
    page:i32,
}

impl Page for MyPage{}
impl PerPage for MyPage{}

fn testPage(){
    let p1 = MyPage{page:1};
    p1.set_page(2);
    p1.set_perpage(3);
}

Page Default:2
Per Page:3



pub trait Fly{
    fn fly(&self)->bool;
}

#[derive(Debug)]
struct Duck;
#[derive(Debug)]
struct Pig;

impl Fly for Duck{
    fn fly(&self)->bool{
        return true;
    }
}

impl Fly for Pig{
    fn fly(&self)->bool{
        return false;
    }
}

fn fly_static(s:impl Fly+Debug) -> bool{
    s.fly()
}

fn can_fly(s:impl Fly+Debug)->impl Fly{
    if s.fly(){
        println!("{:?} can fly",s);
    }else{
        println!("{:?} can't fly",s);
    }
    s
}

fn test_fly(){
    let pig = Pig;
    let pig = can_fly(pig);
    let d = Duck;
    if d.fly(){
        println!("{:?} can fly",d);
    }
}

Pig can't fly
Duck can fly


分享到:
评论

相关推荐

    Rust Trait 静态派发与动态派发示例

    https://blog.csdn.net/weixin_47560078/article/details/143573536 博客源码

    Rust学习笔记_78实用知识库分享

    3. Rust trait系统:Rust学习笔记Day 7-12讲述了Rust的trait系统,包括trait的定义、trait的实现、trait的继承、trait的约束规则等。 4. Rust智能指针:Rust学习笔记Day 13-15讲述了Rust的智能指针,包括Box、Cow等...

    manual_call_rust_trait_function

    在Rust编程语言中,`trait`是一种强大的特性,它定义了一组方法,可以被不同的类型实现。`manual_call_rust_trait_function`这个主题显然关注的是如何手动调用实现了特定trait的函数。在这个场景中,我们将深入探讨...

    Rust基础关键字介绍.docx

    ### Rust基础关键字详解 #### 一、引言 Rust 是一种系统级编程语言,以其高效、可靠且安全的特点著称。它旨在提供强大的性能同时确保内存安全性,使其成为开发高性能系统软件的理想选择。Rust 的关键字是构成其...

    稳定 Rust 上的特征别名

    trait-set : 稳定 Rust 上的 trait 别名地位:项目信息:支持稳定的 Rust 上的特征别名。描述这个 crate 提供对trait aliases 的支持:Rust 编译器已经支持的一个特性,但还不稳定。这个想法很简单:将一组特征组合...

    Rust 编程视频教程(进阶)——019 sync 和 send trait 的可扩展并发

    1、有两个并发概念内嵌于语言中:std::marker中的Sync和Send trait。 2、通过Send允许在线程间转移所有权 (1)Send标记trait表明类型的所有权可以在线程间传递。几乎所有的Rust类型都是Send的,但是例外:例如Rc是...

    程序设计训练之 Rust 编程语言 第四讲:泛型、特型与生命周期

    trait PrettyPrint { fn format(&self) -&gt; String; } ``` 这个特型定义了一个 `format` 方法,任何实现了 `PrettyPrint` 特型的类型都需要提供该方法的实现。 **2.3 实现特型** 接下来,我们可以为具体类型实现...

    rust_and_trait_pub.pdf

    Rust 语言和 Trait Rust 语言是 Mozilla 员工 Graydon Hoare 的私人项目,2009 年 Mozilla 开始赞助这个项目,并在 2010 年首次揭露了它的存在。Rust 1.0 于 2015 年 5 月 15 日发布,现在 Rust 由 Mozilla 支持,...

    Rust 程序设计语言 简体中文版.pdf

    第六章介绍了 Rust 的 trait 系统,包括 trait 的定义、trait 的实现、trait 的继承等。 第七章讲解了 Rust 的泛型编程机制,包括泛型类型、泛型函数、泛型 trait 等。 第八章介绍了 Rust 的宏编程机制,包括宏的...

    Rust 程序设计Rust 程序设计语言

    Rust程序设计语言的升级迭代中,还包括了新的`impl Trait`语法的引入,这在第十章有所体现。`impl Trait`语法简化了类型说明,允许在函数签名中使用`impl Trait`来代替复杂的泛型类型,从而简化了泛型编程的复杂性。...

    【Rust编程核心】Trait:Rust语言的契约与行为

    Rust是一种系统编程语言,专注于安全、速度和并发性。它由Mozilla研究院发起,由Graydon Hoare设计,并于2010年首次发布。Rust语言的设计目标是提供对内存安全和数据竞争的保证,同时保持C和C++级别的性能。 Rust的...

    remote-trait-object:一个简单而强大的基于 trait 对象的 Rust 远程方法调用库

    远程特征对象 一个简单而强大的 Rust 远程方法调用库,基于 Rust trait 对象。 请参阅。执照获得许可Apache 许可证,版本 2.0( 或 ) MIT 许可证( 或 ) 在您的选择。贡献除非您明确声明,否则您有意提交以供您...

    通过例子学Rust 中文版(带完整目录)

    6. **trait**:Trait是Rust中的接口定义,允许为不同类型的对象定义方法。`Self`关键字在trait中用于引用实现该trait的类型。Rust标准库(std)提供了许多预定义的trait,可以方便地进行类型操作。 7. **宏(Macros...

    通过例子学rust 中文版 (rust team).pdf

    ### 通过例子学Rust知识点总结 #### 一、Rust简介与特点 - **安全性**:Rust通过严格的内存安全规则确保程序不会出现常见的内存安全问题,如空指针引用、野指针等。 - **速度**:Rust语言在性能上与C和C++相当,...

    通过例子学Rust

    从上面提供的内容来看,这本书涵盖了Rust编程语言的方方面面,从最基础的语法到如何组织代码、使用标准库,再到更高级的主题,比如宏、特性(trait)、泛型编程等。对于Rust的每个概念,书籍都通过具体的代码示例来...

    Rust代码和资源的整理清单汇总-全网最全,快速精通rust

    同时,trait(特质)和泛型提供了元编程能力。 7. **并发编程**:Rust的并发模型基于所有权和线程局部状态,通过通道、Mutex(互斥锁)和Arc(原子引用计数)等工具,安全地实现了多线程和异步编程。 8. **标准库*...

    Rust 程序设计语言(第二版) 简体中文版

    - **泛型、Trait 与生命周期**:这部分内容介绍了 Rust 中的高级概念,包括泛型、Trait 和生命周期。这些概念使得 Rust 代码更加灵活和可重用。 - **测试**:这部分内容介绍了 Rust 的测试框架,包括如何编写测试、...

    Rust学习路线图-CSDN_pro 低,中,高阶路线图

    3. 트rait:Rust语言中有trait的概念,trait是指类型的行为。 4. 错误处理:Rust语言中有多种错误处理机制,包括Result和Option等。 5. 并发编程:Rust语言支持并发编程,包括async和await关键字。 三、高阶知识 1...

    Rust 中 用于微控制器的 实验性设备端 USB 框架_rust_代码_相关文件_下载

    Rust 中用于嵌入式设备的实验性设备端 USB 堆栈。 此板条箱仍在开发中,不应视为生产就绪,甚至不兼容 USB。 UsbDevice 对象代表一个复合 USB 设备,是应用程序实现者最重要的对象。UsbDevice 结合了许多 ...

    rust示例教程rust-by-example

    而“Debug”和“Display”部分则分别展示了如何通过`Debug`和`Display`两个trait来定制类型输出。 在“Testcase: List Formatting”中,学习者可以找到如何将向量格式化为列表形式输出的例子,这是学习集合类型使用...

Global site tag (gtag.js) - Google Analytics