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();