enum Edge<T> {
Edge(Option<T>),
Nothing
}
impl<T> fmt::Display for Edge<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", match self {
&Edge::Edge(_) => "E",
&Edge::Nothing => "-",
})
}
}
impl<T: fmt::Display> fmt::Display for Edge<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}({})", match self {
&Edge::Edge(_) => "E",
&Edge::VirtualEdge(_) => "e",
&Edge::Nothing => "-",
}, match self {
&Edge::Edge(Some(v)) => v,
&Edge::VirtualEdge(Some(v)) => v,
_ => "-"
})
}
}
Так нельзя, потому что в расте нет специализации. А как в таких случаях надо писать?
Замысел состоит в том, что второй impl основной, а первый — fallback на тот случай, если Edge инстанцировали от чего-то, что нельзя распечатать.