Rust中如何判断返回错误是否匹配自定义错误的指定变体
错误原因
downcast_ref的泛型参数要求传入完整类型,而XError::TagNotFound是枚举XError的内部变体,本身不属于类型,因此不符合语法要求。Rust的trait对象向下转型是基于类型ID实现的,只能识别到整个枚举的类型,无法直接定位到枚举的单个变体。
正确实现
你需要先把错误对象向下转型为&XError类型,再判断变体是否为TagNotFound,示例代码如下:
// 写法1:拆分步骤更清晰 let err = validate(param).unwrap_err(); let x_error = err.downcast_ref::<XError>(); assert!(matches!(x_error, Some(XError::TagNotFound))); // 写法2:链式调用更紧凑 assert!(matches!( validate(param).unwrap_err().downcast_ref::<XError>(), Some(XError::TagNotFound) ));
注意事项
要使用downcast_ref方法,要求目标类型满足'static生命周期约束,你的XError枚举没有持有非静态引用,默认满足该约束,可以直接使用。
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

