要求相关的错误类型实现Debug特性是一种好习惯吗?

时间:2018-11-28 23:23:23

标签: rust

我遇到了utf8_general_ci条板箱的问题。当我尝试在从piston2d-graphics方法获得的expect()上使用Result方法时,事实证明我做不到—因为它要求Result的Error类型实现{{1 }}特性:

graphics::character::CharacterCache::character

std::fmt::Debugerror[E0599]: no method named `expect` found for type `std::result::Result<graphics::character::Character<'_, <G as graphics::Graphics>::Texture>, <C as graphics::character::CharacterCache>::Error>` in the current scope --> src/some_file.rs:44:53 | 44 | let ch_glyph = glyphs.character(34, ch).expect("Couldn't load character"); | ^^^^^^ | = note: the method `expect` exists but the following trait bounds were not satisfied: `<C as graphics::character::CharacterCache>::Error : std::fmt::Debug` 特征的关联(嵌套)类型。我可以轻松地提交添加需求的PR,然后使用简单的generate宏将其实现添加到所有其他板条箱。这似乎是合理的,因为Error和其他相关方法一直在Rust中使用,但是我不确定。是Rust的方式,还是有理由不这样做?


我用一个例子来描述这个问题,但是它与活塞无关,我的问题是关于Rust中的一般模式。因此标签CharacterCache是不相关的,请不要将其添加到问题中。

1 个答案:

答案 0 :(得分:4)

  

要求相关的错误类型实现调试特征是一种好习惯吗?

是的,如果可能的话。也许他们忘记了。

解决此问题的一种方法是使用map_err(),这里是问题的MCVE:

struct Error;

fn foo() -> Result<(), Error> {
    Ok(())
}

fn main() {
    foo().expect("no error");
}
error[E0599]: no method named `expect` found for type `std::result::Result<(), Error>` in the current scope
 --> src/main.rs:8:11
  |
8 |     foo().expect("no error");
  |           ^^^^^^
  |
  = note: the method `expect` exists but the following trait bounds were not satisfied:
          `Error : std::fmt::Debug`

使用map_err()产生一个实现Debug的错误,这可能是您自己的自定义错误,在以下示例中,我只是将()作为错误返回:

struct Error;

fn foo() -> Result<(), Error> {
    Ok(())
}

fn main() {
    foo().map_err(|_| ()).expect("no error");
}