2015-06-11 2 views
7

Aus irgendeinem Grund beschwert sich der Rust-Compiler, dass Resultunwrap nicht implementiert, obwohl der von mir bereitgestellte Fehlertyp Debug implementiert. Der Code, der fehlerhaft ist, wird unten bereitgestellt.Der Ergebnistyp implementiert keine Methode im Bereich mit dem Namen `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() 
    } 
} 

Antwort

4

Wenn Sie Ihren Typ definieren

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

Sie tatsächlich Ihre Art definieren zu sein ein unsized type als MyError kein konkreter ist, sondern ein Merkmal. Aber führt die Umsetzung von Result<T, E>

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

Welche implizit E erfordert eine Größe Typ sein. Also in Ihrem Fall, wie es nicht ist, ist die Implementierung ungültig und nicht verfügbar (tatsächlich, die meisten, wenn nicht die gesamte Implementierung von Result<T, E> erfordert T und E zu Größe, so ein unsize Result ist nicht sehr nützlich).

Die einfachste fix in Ihrem Fall ist der Fehler in einem Box, so zu setzen:

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