我有这个代码:
fn do_stuff() -> Result<i32, String> {
let repo = git2::Repository::open(".")?;
// ...
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为git2::Repository::open()的错误类型不是String。(是的,我使用字符串处理错误很懒惰。这是一个小程序;起诉我。)
fn do_stuff() -> Result<i32, String> {
let repo = git2::Repository::open(".")?;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我试过添加这个:
impl std::convert::From<git2::Error> for String {
fn from(err: git2::Error) -> Self {
err.to_string()
}
}
Run Code Online (Sandbox Code Playgroud)
但这是不允许的,因为它不引用此 crate 中定义的任何类型。
我知道我可能可以使用.map_err(),但我真的希望它自动发生。我有点觉得我以前也有这个工作,这有点烦人!
如果一个类型实现了std::error::Error,它也实现了Display:
pub trait Error: Debug + Display {
// ...
}
Run Code Online (Sandbox Code Playgroud)
ToString提供方法的traitto_string是为任何实现 的类型实现的Display。
因此,任何实现的类型Error都可以转换为Stringvia to_string:
use git2; // 0.13.2
fn do_stuff() -> Result<i32, String> {
let repo = git2::Repository::open(".").map_err(|e| e.to_string())?;
unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)