2015-06-11 18 views
7

Z jakiegoś powodu kompilator Rusta narzeka, że ​​Result nie implementuje unwrap, mimo że podany typ błędu implementuje debugowanie. Kod, który zawiera błąd, podano poniżej.Typ wyniku nie implementuje metody w zakresie o nazwie `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() 
    } 
} 

Odpowiedz

4

Podczas definiowania twój typ

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

rzeczywiście określić typ być unsized type jak MyError nie jest to rodzaj betonu, ale cecha. Ale realizacja Result<T, E> stwierdza

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

Które niejawnie wymaga E być rodzajem wielkości. Tak więc w twoim przypadku, ponieważ nie jest, implementacja jest nieważna i niedostępna (w rzeczywistości, większość, jeśli nie cała implementacja Result<T, E> wymaga, aby rozmiar został zmieniony, więc niezaszyfrowany Result nie jest zbyt użyteczny).

Najprostszą w Twoim przypadku jest umieścić swój błąd w Box, tak:

type MyResult<T> = Result<T, Box<MyError>>; 
Powiązane problemy