2015-06-11 20 views
7

Vì một số lý do, trình biên dịch Rust phàn nàn rằng Result không thực hiện unwrap, mặc dù loại Lỗi mà tôi cung cấp không thực hiện Debug. Mã lỗi được cung cấp bên dưới.Loại kết quả không triển khai phương thức trong phạm vi có tên `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() 
    } 
} 

Trả lời

4

Khi bạn xác định loại hình

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

Bạn thực sự xác định loại của bạn là một unsized type như MyError không phải là một loại bê tông, nhưng một đặc điểm. Nhưng, việc thực hiện Result<T, E> khẳng định

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

nào ngầm đòi hỏi E là một loại kích thước. Vì vậy, trong trường hợp của bạn, vì nó không phải là, việc triển khai không hợp lệ và không có sẵn (thực tế, hầu hết nếu không phải tất cả việc triển khai Result<T, E> yêu cầu TE để có kích thước, do đó, Result chưa được đánh dấu không hữu ích).

Việc sửa chữa đơn giản nhất trong trường hợp của bạn là đặt lỗi của bạn trong một Box, như thế này:

type MyResult<T> = Result<T, Box<MyError>>; 
Các vấn đề liên quan