2015-06-11 40 views
7

由於某些原因,Rust編譯器抱怨Result未實現unwrap,即使錯誤類型I提供的確沒有實現Debug。下面提供了錯誤代碼。結果類型未實現名爲`unwrap`的範圍內的方法

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() 
    } 
} 

回答

4

當你定義你的類型

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

實際上,你定義你的類型是一個unsized typeMyError不是一個具體類型,而是一種品質。但,Result<T, E>實施規定

impl<T, E> Result<T, E> where E: Debug { 
    /* ... */ 
} 

含蓄地要求E是一個大小類型。因此,在你的情況,因爲它不是,實施無效和不可用的(實際上,如果不是所有的Result<T, E>實施需要TE是大小,所以一個未施膠Result不是非常有用)。

你的情況最簡單的解決方法是把你的錯誤在Box,像這樣:

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