结果类型未在名为`unwrap`的作用域中实现方法

bra*_*178 7 rust

由于某种原因,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)

Lev*_*ans 5

定义类型时

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>需要TE进行大小调整,因此未大小调整Result不是很有用)。

在这种情况下,最简单的解决方法是将您的错误放入Box,如下所示:

type MyResult<T> = Result<T, Box<MyError>>;
Run Code Online (Sandbox Code Playgroud)