Trait Objects
Trait objects 是 trait 的一种抽象,它允许在运行时处理实现了特定 trait 的不同类型。在 trait objects 中,类型被擦除,允许在运行时使用相同的接口来处理不同的具体类型。
trait Printable {
fn print(&self);
}
struct Circle {
radius: f64,
}
struct Rectangle {
width: f64,
height: f64,
}
impl Printable for Circle {
fn print(&self) {
println!("Printing Circle with radius: {}", self.radius);
}
}
impl Printable for Rectangle {
fn print(&self) {
println!(
"Printing Rectangle with width: {} and height: {}",
self.width, self.height
);
}
}
fn main() {
let circle = Circle { radius: 5.0 };
let rectangle = Rectangle {
width: 4.0,
height: 6.0,
};
print_shape(&circle);
print_shape(&rectangle);
}
fn print_shape(shape: &dyn Printable) {
shape.print();
}
在这个例子中,print_shape 函数接受一个实现了 Printable trait 的 trait object,这使得它能够接受不同类型的参数(如 Circle 和 Rectangle)。
全类型与 dyn Trait
在 Rust 中,全类型常常与 dyn Trait 一同出现。dyn Trait 表示 trait object 的类型,用于指定 trait object 的具体类型。
trait Printable {
fn print(&self);
}
struct Circle {
radius: f64,
}
struct Rectangle {
width: f64,
height: f64,
}
impl Printable for Circle {
fn print(&self) {
println!("Printing Circle with radius: {}", self.radius);
}
}
impl Printable for Rectangle {
fn print(&self) {
println!(
"Printing Rectangle with width: {} and height: {}",
self.width, self.height
);
}
}
fn main() {
let circle = Circle { radius: 5.0 };
let rectangle = Rectangle {
width: 4.0,
height: 6.0,
};
print_shape(&circle);
print_shape(&rectangle);
}
fn print_shape(shape: &dyn Printable) {
shape.print();
}
在这个例子中,&dyn Printable 表示一个实现了 Printable trait 的 trait object 的引用。通过使用 &dyn Printable,我们可以接受不同类型的对象,并调用相同的 print 方法。
全类型与 dyn Trait 的使用使得 Rust 具有更灵活的泛型编程能力,允许在运行时动态地处理不同类型的对象。
转载请注明出处:http://www.zyzy.cn/article/detail/6813/Rust