出于某种原因,Rust编译器抱怨Result
没有实现unwrap
,即使我提供的错误类型确实实现了Debug。下面提供了错误的代码。
use std::fmt::{Display, Debug};
use std::error::Error;
trait MyError: Error + Display + Debug {}
type MyResult<T> = Result<T, MyError>;
trait Foo: Clone {}
trait MyTrait {
fn my_function<T: Foo>(&self) -> MyResult<T>;
fn unwrap_function<T: Foo>(&self) -> T {
self.my_function().unwrap()
}
}
答案 0 :(得分:4)
定义类型时
type MyResult<T> = Result<T, MyError>;
您实际上将类型定义为unsized type,因为MyError
不是具体类型,而是特征。但是,Result<T, E>
州的实施
impl<T, E> Result<T, E> where E: Debug {
/* ... */
}
隐含地要求E
为大小类型。因此,在您的情况下,实际上,实现无效且不可用(实际上,Result<T, E>
的大多数(如果不是全部)实现都需要T
和E
的大小,因此unsized Result
不是很有用。)
您的案例中最简单的解决方法是将错误放在Box
中,如下所示:
type MyResult<T> = Result<T, Box<MyError>>;