trait Display {
fn display(&self);
}
fn print_elements<T: Display>(elements: &[T]) {
for element in elements {
element.display();
}
}
trait约束的作用
- 类型限制:通过
T: Display
这种语法,限制了泛型 T
必须实现 Display
trait。这样可以确保在函数 print_elements
内部调用 element.display()
时,T
类型确实有这个方法。如果没有这个约束,编译器无法确定 T
类型是否有 display
方法,会导致编译错误。
- 代码复用与多态:允许函数接受多种不同类型但都实现了
Display
trait 的参数,从而实现代码的复用。不同类型只要实现了 Display
trait,都可以作为参数传递给 print_elements
函数,达到多态的效果。
确保类型满足相应trait
- 实现trait:在调用
print_elements
函数之前,要确保传递的类型实现了 Display
trait。例如:
struct MyType;
impl Display for MyType {
fn display(&self) {
println!("This is MyType");
}
}
fn main() {
let my_vec: Vec<MyType> = Vec::new();
print_elements(&my_vec);
}
- 类型检查:Rust 编译器在编译时会检查传递的类型是否实现了
Display
trait。如果类型没有实现该trait,编译器会报错,提示相应的类型不满足trait约束。这样在编译阶段就可以发现类型不匹配的问题,而不是在运行时出现错误。