我遇到了utf8_general_ci
条板箱的问题。当我尝试在从piston2d-graphics
方法获得的expect()
上使用Result
方法时,事实证明我做不到—因为它要求Result的Error类型实现{{1 }}特性:
graphics::character::CharacterCache::character
std::fmt::Debug
是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`
特征的关联(嵌套)类型。我可以轻松地提交添加需求的PR,然后使用简单的generate宏将其实现添加到所有其他板条箱。这似乎是合理的,因为Error
和其他相关方法一直在Rust中使用,但是我不确定。是Rust的方式,还是有理由不这样做?
我用一个例子来描述这个问题,但是它与活塞无关,我的问题是关于Rust中的一般模式。因此标签CharacterCache
是不相关的,请不要将其添加到问题中。
答案 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");
}