#![allow(dead_code, deprecated, unused_variables, unused_mut)] use std::cmp::Ordering; #[derive(Debug)] struct Character { health: u32, experience: u32, } impl PartialOrd for Character { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } impl Ord for Character { fn cmp(&self, other: &Self) -> std::cmp::Ordering { if self.health < 50 { self.health.cmp(&other.health) } else { self.experience.cmp(&other.experience) } } } impl PartialEq for Character { fn eq(&self, other: &Self) -> bool { self.cmp(other) == Ordering::Equal } } impl Eq for Character {} fn main() { let a = Character { health: 3, experience: 5, }; let b = Character { health: 10, experience: 77, }; let c = Character { health: 143, experience: 2, }; assert!(a < b && b < c && c < a); assert_eq!((a < c) as u8 + (c < a) as u8, 2); }