Rust学习笔记007:Trait --- Rust的“接口”

Trait

  • 在Rust中,Trait(特质)是一种定义方法集合的机制,类似于其他编程语言中的接口(java)或抽象类(c++的虚函数)。

定义Trait

trait MyTrait {
    //关键字trait(线条、特征、勾勒)
    // 定义Trait的方法
    fn my_method(&self);//只有方法签名,没有具体实现,实现该trait的类型必须提供具体实现

    // 可选:可以在这里定义其他方法
    fn my_method_1(&self)-> String {
   
        String::from("也可以提供默认实现")
    };
}

实现Trait

struct MyStruct;

//实现trait用impl这个关键字,格式为impl trait_name for struct_name{}。impl另一个主要的用途是实现struct的“类成员方法”,格式为impl struct_name{}
impl MyTrait for MyStruct {
   
    fn my_method(&self) {
   
        println!("This is the implementation for my_method in MyStruct");
    }
}

孤儿规则

  • 可在某个类型上实现trait:

    • 类型或者trait在当前作用域中定义的
  • 无法为外部类型来实现外部的trait:

    • 这个限制是程序属性的一部分(也就是一致性)。
    • 更具体的说是孤儿规则:之所以这样命名是因为父类型不存在。
    • 此规则确保其他人的代码不能破坏您的diamond,反之亦然。
    • 如果没有这个规则,两个crate可以为同一个理性实现同一个trait,Rust就不知道该使用哪个实现了。
    • 如果允许任意 crate 对任意类型实现任意 trait,可能会导致多个 crate 中的相同类型实现相同的 trait,这会引起冲突和不可预期的行为。

引入与使用Trait

简单示例:

// 定义一个 Trait
trait Animal {
   
    fn make_sound(&self);
}

// 实现 Trait for struct Dog
struct Dog;

impl Animal for Dog {
   
    fn make_sound(&self) {
   
        println!("Woof!");
    }
}

// 使用 Trait 对象
fn print_sound(a: &dyn Animal) {
   
    a.make_sound();
}

fn main() {
   
    let dog = Dog;
    // 两种调用方法
    dog.make_sound(); 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值