【问题标题】:Result type does not implement method in scope named `unwrap`结果类型未在名为“unwrap”的范围内实现方法
【发布时间】:2015-06-11 17:13:16
【问题描述】:

由于某种原因,Rust 编译器抱怨 Result 没有实现 unwrap,即使我提供的 Error 类型确实实现了 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()
    }
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    当你定义你的类型时

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

    您实际上将您的类型定义为unsized type,因为MyError 不是具体类型,而是特征。但是,Result&lt;T, E&gt; 状态的实现

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

    这隐含地要求E 是一个调整大小的类型。因此,在您的情况下,实际上不是,实现无效且不可用(实际上,Result&lt;T, E&gt; 的大多数(如果不是全部)实现需要调整 TE 的大小,因此未调整大小的 Result 不是非常有用)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 2015-03-30
      • 1970-01-01
      • 2022-12-11
      • 2017-03-22
      • 2023-01-15
      • 2018-07-08
      • 1970-01-01
      相关资源
      最近更新 更多