Traits define shared behavior that types can implement - similar to interfaces in other languages.
trait Summary {
fn summarize(&self) -> String;
// Default implementation
fn preview(&self) -> String {
format!("Read more: {}", self.summarize())
}
}struct Article {
title: String,
content: String,
}
impl Summary for Article {
fn summarize(&self) -> String {
format!("{}: {}", self.title, &self.content[..50])
}
}// impl Trait syntax (simpler)
fn notify(item: &impl Summary) {
println!("Breaking: {}", item.summarize());
}
// Trait bound syntax (more flexible)
fn notify<T: Summary>(item: &T) {
println!("Breaking: {}", item.summarize());
}Common traits in Rust: Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default
Describable trait with a describe(&self) -> String methodDog (return "Dog: {name}")Cat (return "Cat: {name}")name: String fieldStringDog { name: "Buddy" }trait Describable {
fn describe(&self) -> String;
}
impl Describable for Dog {
fn describe(&self) -> String {
format!("Dog: {}", self.name)
}
}