Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Error handling 无法将io::Error移出可查看的结果_Error Handling_Rust_Iterator_Borrow Checker_Ownership - Fatal编程技术网

Error handling 无法将io::Error移出可查看的结果

Error handling 无法将io::Error移出可查看的结果,error-handling,rust,iterator,borrow-checker,ownership,Error Handling,Rust,Iterator,Borrow Checker,Ownership,我只是想传播IO错误: enum MyError { EOF, IO(std::io::Error), } fn peek_byte<R>(mut p: Peekable<Bytes<R>>) -> Result<u8, MyError> where R: Read, { match p.peek() { None => Err(MyError::EOF), Some(E

我只是想传播IO错误:

enum MyError {
    EOF,
    IO(std::io::Error),
}

fn peek_byte<R>(mut p: Peekable<Bytes<R>>) -> Result<u8, MyError>
where
    R: Read,
{
    match p.peek() {
        None => Err(MyError::EOF),
        Some(Err(e)) => Err(MyError::IO(*e)),  // <==== error is here
        Some(Ok(byte)) => Ok(*byte),
    }
}
我真的理解这一切。我知道我为什么会犯错误,以及错误的含义。我不知道的是如何完成我的任务并将IO错误传播到我的错误类型中


我尝试过
e
*e
e.clone()
*e.clone()
*(e.clone())
,但它们都会产生“类型不匹配”或“无法移动”错误。

peek
迭代器拥有其内部迭代器的下一个值的所有权,并通过
peek
返回引用,但是,如果您确实想要拥有的值,您只需像往常一样调用
next
(这确实会提升迭代器,但我认为在这种情况下这没关系,因为您实际上没有使用迭代器中的任何内容,只是试图返回一个错误):

使用std::io;
使用std::io::Bytes;
使用std::io::Read;
使用std::iter::Peekable;
枚举MyError{
EOF,
IO(IO::错误),
}
fn peek_字节(mut p:peek)->结果
哪里
R:读一下,
{
匹配p.peek(){
无=>Err(MyError::EOF),
Some(Err(e))=>Err(MyError::IO(p.next().unwrap().unwrap_Err()),
一些(正常(字节))=>Ok(*字节),
}
}

我已经想到了这一点,但我不确定next()是否会始终返回与peek()相同的值。(如果错误条件消失怎么办?)似乎是解决我问题的好办法。谢谢大家!
next()
始终返回与
peek()
相同的值,因为
Peekable
保存该值。Rust中的错误与其他任何错误一样,只是简单的数据,即使导致错误的基本情况消失
Peekable
仍将保留原始错误实例。
error[E0507]: cannot move out of `*e` which is behind a shared reference
  --> src/main.rs:17:41
   |
17 |         Some(Err(e)) => Err(MyError::IO(*e)),
   |                                         ^^ move occurs because `*e` has type `std::io::Error`, which does not implement the `Copy` trait