様々な型に対応できる処理に対応できるのがジェネリクス
#[derive(Debug)] struct Sample<T> { name:String, value:T } fn main() { let taro = Sample { name:String::from("Taro"), value:String::from(("this is message.")) }; let hanako = Sample { name:String::from("Hanako"), value: 1234 }; println!("{:?}", taro); println!("{:?}", hanako); }
SampleにVec
#[derive(Debug)] struct Sample<T:core::fmt::Debug> { name:String, value:Vec<T> } impl<T:core::fmt::Debug> Sample<T> { fn print_values(&self) { println!("*** {} ***", &self.name); for item in &self.values { println!("{:?}", item); } } } fn sample<T:core::fmt::Debug>(name:&str, values:Vec<T>) -> Sample<T>{ Sample{name:String::from(name), values:values} } fn main() { let taro = sample("Taro", vec![123, 456, 789]); taro.print_values(); let hanako = sample("Hanako", vec!["Hello", "Welcome", "Bye!"]); hanako.print_values(); }
trait Print { fn print(&self) { println!("not implmented..."); } } struct Person { name: String, mail: String, age: i32 } struct Student { name: String, mail:String, grade: i32 } impl Print for Person { fn print(&self) { println!("Person: {}<{}>({})", &self.name, &self.mail, &self.age); } } impl Print for Student { fn print(&self) { println!("Student [grade {}]{}<{}>", &self.grade, &self.name, &self.mail); } } fn person(name:&str, mail:&str, age:i32)->Box<Person>{ Box::new(Person{name:String::from(name), mail:String::from(mail), age:age}) } fn student(name:&str, mail:&str, grade:i32)->Box<Student>{ Box::new(Student{name:String::from(name), mail:String::from(mail), grade}) }