我有这段代码:
fn do_stuff() -> Result<i32, String> {
let repo = git2::Repository::open(".")?;
// ...
}
这不起作用,因为git2::Repository::open()
的错误类型不是String
。 (是的,我通过使用字符串来处理我的错误非常懒惰。它是一个小程序;起诉我。)
error[E0277]: the trait bound `std::string::String: std::convert::From<git2::Error>` is not satisfied
--> src/main.rs:94:13
|
94 | let repo = Repository::open(".")?;
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<git2::Error>` is not implemented for `std::string::String`
|
= help: the following implementations were found:
= help: <std::string::String as std::convert::From<&'a str>>
= help: <std::string::String as std::convert::From<std::borrow::Cow<'a, str>>>
= note: required by `std::convert::From::from`
我已尝试添加此内容:
impl std::convert::From<git2::Error> for String {
fn from(err: git2::Error) -> Self {
err.to_string()
}
}
但这是不允许的,因为它没有引用此箱子中定义的任何类型。
我知道我可以使用.map_err()
,但我真的希望自动发生。我觉得我之前也有这个工作,这有点烦人!
答案 0 :(得分:4)
如果某个类型实现了std::error::Error
,it also implements Display
:
pub trait Error: Debug + Display {
fn description(&self) -> &str;
fn cause(&self) -> Option<&Error> { ... }
}
提供方法to_string
的{{3}}特征是针对实现Display
的任何类型实现的。
因此,任何实现Error
的类型都可以通过String
转换为to_string
:
extern crate git2;
fn do_stuff() -> Result<i32, String> {
let repo = git2::Repository::open(".").map_err(|e| e.to_string())?;
unimplemented!()
}
答案 1 :(得分:2)
事实证明这有一点in the Rust book。它不允许您转换为String
,但显然所有Error
类型都可以转换为Box<Error>
,所以我只是将String
替换为label = ""
。它也更清洁。