为何无法为泛型参数非Debug的Display+Debug泛型类型实现std::error::Error?
Rust自定义错误枚举的trait实现问题
定义自定义错误枚举
先看这个自定义错误枚举:
#[derive(Debug)] pub enum MyError<T: FromStr> where <T as FromStr>::Err: fmt::Debug { Variant1, Variant2, FromStrErr(<T as FromStr>::Err), }
正常运行场景
这段代码可正常编译运行,我们能为它实现Display trait,且借助derive(Debug)宏自动实现的Debug trait,可按预期使用:
fn main() { fn parse(s: &str) -> Result<u32, MyError<u32>> { s.parse::<u32>().map_err(MyError::FromStrErr) } println!("{:?}", parse("32")); //→ Ok(32) println!("{:?}", parse("32a")); //→ Err(FromStrErr(ParseIntError { kind: InvalidDigit })) }
实现trait时的错误
但尝试为该类型实现std::error::Error trait时:
impl<T: FromStr> std::error::Error for MyError<T> where <T as FromStr>::Err: fmt::Debug { }
即便MyError<T>已实现Debug和Display,编译仍报错:T未实现Debug。错误详情包括:
T无法使用{:?}格式化,因未实现Debug(属实但无关,T并未出现在枚举结构中)- 备注:
MyError<T>实现Debug需要T实现Debug(该说法错误,MyError<T>已正常实现Debug)
甚至自定义标记trait也会触发相同错误:
pub trait MyErrorTrait: fmt::Debug + fmt::Display { } impl<T: FromStr> MyErrorTrait for MyError<T> where <T as FromStr>::Err: fmt::Debug { }
这段代码同样报错T未实现Debug,且错误备注称MyError<T>实现Debug需要T实现Debug(实际不成立)。
问题核心
目前有不少规避方法,但需要明确:为何为该类型添加trait实现会触发这个错误?
内容的提问来源于stack exchange,提问作者Xharlie
相关产品推荐
相关产品推荐

