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

时间:2015-06-11 17:13:17

标签: 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()
    }
}

1 个答案:

答案 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>的大多数(如果不是全部)实现都需要TE的大小,因此unsized Result不是很有用。)

您的案例中最简单的解决方法是将错误放在Box中,如下所示:

type MyResult<T> = Result<T, Box<MyError>>;