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() }