Это хорошая практика требовать, чтобы связанные типы ошибок реализовали черту отладки? - PullRequest
0 голосов
/ 29 ноября 2018

Я столкнулся с проблемой с piston2d-graphics ящиком.Когда я пытаюсь использовать метод expect() для Result, полученный из метода graphics::character::CharacterCache::character, оказывается, что я не могу - потому что для реализации черты std::fmt::Debug требуется тип ошибки Result:

error[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`

Error - это связанный (вложенный) тип в признаке CharacterCache.Я могу легко представить PR, который добавляет требование, а затем добавить его реализацию с простым макросом производных для всех других ящиков.Это кажется разумным, потому что expect() и другие связанные методы используются в Rust все время, но я не уверен.Это способ Rust, или есть причины не делать этого?


Я описываю вопрос на примере его возникновения, но он не имеет ничего общего с поршнем, мой вопрос касается общего характерав ржавчинеТак что тег rust-piston не имеет отношения, пожалуйста, не добавляйте его к вопросу.

1 Ответ

0 голосов
/ 29 ноября 2018

Полезно ли требовать, чтобы связанные типы ошибок реализовывали черту отладки?

Да, когда это возможно.Возможно, они об этом забывают.

Чтобы решить эту проблему, используйте 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...