rust - 返回自定义结果时如何解析 "expected (), found Result"?

标签 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 )

最佳答案

请注意,错误消息是因为您没有从函数中返回 Err。您只需创建它,它就会成为 if block 的值。因为没有else block ,else block 的类型是(),所以if的值> 表达式不确定:它是 () 还是 Result

您可以返回 Err 或提供一个else block :

if concatedsets.len() != self.dataset.len() {
    Err(Error::new(ErrorKind::Other, "Not a subset"))
} else {
    Ok(true)
}

这会引发另一个错误,即您没有返回您所说的类型。 错误 不是 子集错误。因为您已经为该错误类型实现了 From,所以您可以使用 try!? 在类型之间进行转换:

Err(Error::new(ErrorKind::Other, "Not a subset"))?

您还可以显式包装类型,如 shown in squiguy's answer .

关于rust - 返回自定义结果时如何解析 "expected (), found Result"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001683/

相关文章:

rust - 一次实现多种类型的特征

javascript - 如何在 Firefox 网络扩展的内容脚本中使用 Wasm?

reference - 如何使用 Arc 和 Weak 创建循环引用?

rust - 处理流时如何删除或忽略错误?

datetime - 如何找到 2 个 NaiveDateTimes 之间的区别?

docker - docker 中的 Rust actix_web 无法实现,为什么?

rust diesel-cli 为不同的环境设置多个 env 文件

rust - 使用扫描迭代器时,如何在返回结果和下一次迭代之间共享状态?

rust - 如何使用 Clap 提供多行帮助消息?

rust - 什么是有和无?