如何解决"期望(),找到结果"返回自定义结果时?

时间:2016-08-17 16:18:06

标签: rust

我正在创建自定义Result,以使Ok值是通用的,但我收到以下错误:

error[E0308]: mismatched types
  --> src/main.rs:38:13
   |
38 |             Err(Error::new(ErrorKind::Other, "Not a subset"))
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected (), found enum `std::result::Result`
   |
   = note: expected type `()`
              found type `std::result::Result<_, std::io::Error>`

使用此代码:

use std::io;
use std::io::{Error, ErrorKind};

pub type SubsetResult<T> = Result<T, SubsetError>;

#[derive(Debug)]
pub enum SubsetError {
    Io(io::Error),
}

impl From<io::Error> for SubsetError {
    fn from(err: io::Error) -> SubsetError {
        SubsetError::Io(err)
    }
}

trait Subset {
    type T;
    fn is_subset(&self, &[i32]) -> SubsetResult<Self::T>;
}

#[derive(Debug)]
struct Set {
    dataset: Vec<i32>,
}

impl Subset for Set {
    type T = bool;

    // self is the superset
    fn is_subset(&self, subset: &[i32]) -> SubsetResult<Self::T> {
        let mut concatedsets = Vec::new();
        concatedsets.extend_from_slice(self.dataset.as_slice());
        concatedsets.extend_from_slice(subset);
        concatedsets.sort();
        concatedsets.dedup();
        if concatedsets.len() != self.dataset.len() {
            Err(Error::new(ErrorKind::Other, "Not a subset"))
        }
        Ok(true)
    }
}


fn main() {
    let superset = Set { dataset: vec![1, 2, 3, 4, 5] };
    let subset = vec![1, 2, 4];
    let result = superset.is_subset(subset.as_slice()).unwrap();
    println!("{}", result);

}

Playground

2 个答案:

答案 0 :(得分:6)

请注意,错误消息是因为您没有从函数返回 Err。您只需创建它,它就成为if块的值。由于没有else块,else块的类型为(),因此if表达式的值是不确定的:是()还是Result一个return

您可以Err else或提供if concatedsets.len() != self.dataset.len() { Err(Error::new(ErrorKind::Other, "Not a subset")) } else { Ok(true) } 块:

Error

解锁了另一个错误,即您没有返回您说的类型。 SubsetError a From。由于您已针对该错误类型实施了try!,因此您可以使用?Err(Error::new(ErrorKind::Other, "Not a subset"))? 来转换类型:

select state, taxing_entity, count(taxing_entity) Total_TRXN_Count
from taxes where effect_date between '2016/07/01' and '2016/07/31' 
group by state, taxing_entity, effect_date

您还可以将类型明确换行为shown in squiguy's answer

答案 1 :(得分:1)

由于您的自定义错误类型包装了IO错误类型,因此您必须在Err结果中进行设置。并且为了返回正确的类型,您还需要一个显式的return语句。

这应该是这样的:

return Err(SubsetError::Io(Error::new(ErrorKind::Other, "Not a subset")));