我正在创建一个自定义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>`
Run Code Online (Sandbox Code Playgroud)
使用此代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
(游乐场)
请注意,该错误信息是因为你没有返回的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)
}
Run Code Online (Sandbox Code Playgroud)
这解锁了另一个错误,即您没有返回您说的类型.一个Error
是不是一个SubsetError
.因为您已From
针对该错误类型实现了,所以您可以使用try!
或?
在类型之间进行转换:
Err(Error::new(ErrorKind::Other, "Not a subset"))?
Run Code Online (Sandbox Code Playgroud)
你也可以明确地包装类型,如squiguy的答案所示.
由于您的自定义错误类型包装了 IO 错误类型,因此您必须在Err
结果中进行设置。为了返回正确的类型,您还需要显式的 return 语句。
它应该是这样的:
return Err(SubsetError::Io(Error::new(ErrorKind::Other, "Not a subset")));
Run Code Online (Sandbox Code Playgroud)