m..nをiter::Step使わず素直にPartialOrd + One + Addだけで実装してくれれば汎用的で分かりやすいと思う

struct Range<T> {
 start: T,
 end: T,
}
fn range<T>(start: T, end: T) -> Range<T> {
 Range { start, end }
}
impl<T: Clone + PartialOrd + One + Add<Output=T>> Iterator for Range<T> {
 type Item = T;
 fn next(&mut self) -> Option<T> {
  if self.start < self.end {
   let result = self.start.clone();
   self.start = self.start.clone() + T::one();
   Some(result)
  } else {
   None
  }
 }
}
fn main() {
 let n :Vec<u8> = range(1, 5).collect();
 let x :Vec<X> = range(X::new("x"), X::new("xxxxx")).collect();
 println!("{:?}", n); // [1, 2, 3, 4]
 println!("{:?}", x); // [X("x"), X("xx"), X("xxx"), X("xxxx")]
}
>>93のX型でも動いたよ