You can use traits to conditionally implement methods to a generic struct. Example:
use std::fmt::Display;
struct Pair<T> {
x: T,
y: T,
}
impl<T> Pair<T> {
fn new(x: T, y: T) -> Self {
Self {x, y} // Notice Self vs self
}
}
impl<T: Display> Pair<T> {
fn print(&self) {
println!("{}, {}", self.x, self.y);
}
}
fn main() {
let p = Pair::new(5, 4);
p.print();
}
In the above example, you might notice the capital 'S' in Self. Capital Self can be used to refer to the type that is being implemented as opposed to self which refers to the calling object.