由于某种原因,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()
}
}
Run Code Online (Sandbox Code Playgroud)
定义类型时
type MyResult<T> = Result<T, MyError>;
Run Code Online (Sandbox Code Playgroud)
实际上,您将类型定义为无大小类型,MyError这不是具体类型,而是特征。但是,执行Result<T, E>状态
impl<T, E> Result<T, E> where E: Debug {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
隐式要求E为大小类型。因此,在您的情况下(实际上并非如此),该实现是无效且不可用的(实际上,大多数(如果不是全部)实现都Result<T, E>需要T并E进行大小调整,因此未大小调整Result不是很有用)。
在这种情况下,最简单的解决方法是将您的错误放入Box,如下所示:
type MyResult<T> = Result<T, Box<MyError>>;
Run Code Online (Sandbox Code Playgroud)