Result型をunwrapする際に、型パラメーターEがDebugを実装しているか指定する必要があるとき

fn read<T>() -> T where T: FromStr {
    let mut buffer = String::new();
    let mut stdin = stdin().lock();
    let _ = stdin.read_line(&mut buffer);
    T::from_str(&buffer.trim()).unwrap() // エラー <T as FromStr>::Err doesn't implement `Debug`
}

原因は、

Result<T, E>型は、unwrapメソッドを呼び出す際は、EがDebugを実装している必要がある。

pub fn unwrap(self) -> T
where
    E: Debug,

したがって以下のように制約を追記する必要がある。 参照 Is there a safe way of constraining FromStr::Err to implement Debug?

fn read<T>() -> T 
    where T: FromStr, 
        <T as FromStr>::Err: Debug { // 関連型の制約を追記
    let mut buffer = String::new();
    let mut stdin = stdin().lock();
    let _ = stdin.read_line(&mut buffer);
    T::from_str(&buffer.trim()).unwrap()
}

こういう場合は、一旦オプショナルに回避することで、unwrapすればよい。

fn read<T>() -> T 
    where T: FromStr {
    let mut buffer = String::new();
    let mut stdin = stdin().lock();
    let _ = stdin.read_line(&mut buffer);
    T::from_str(&buffer.trim()).ok().unwrap()
}