error-handling - 无法将io::Error从可见结果中移出

标签 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(Err(e)) => Err(MyError::IO(*e)),  // <==== error is here
        Some(Ok(byte)) => Ok(*byte),
    }
}
但是,出现以下错误:
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
我实际上了解所有这些。我知道为什么我得到错误,错误意味着什么。我不知道如何完成任务并将IO错误传播到我的错误类型中。
我已经尝试过e*ee.clone()*e.clone()*(e.clone()),但是它们都产生“类型不匹配”或“无法移动”错误。

最佳答案

Peekable迭代器拥有其内部迭代器的下一个值的所有权,并通过peek返回引用,但如果您实际上想要拥有的值,则只需照常调用next(这确实会使迭代器前进,但在这种情况下,我认为这是可以的,因为您并没有真正消耗迭代器的任何内容,而只是尝试返回一个错误):

use std::io;
use std::io::Bytes;
use std::io::Read;
use std::iter::Peekable;

enum MyError {
    EOF,
    IO(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(p.next().unwrap().unwrap_err())),
        Some(Ok(byte)) => Ok(*byte),
    }
}
playground

关于error-handling - 无法将io::Error从可见结果中移出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65968762/

相关文章:

带 while 循环的 C++11 反向迭代器

c# - 为什么 Iterator 定义 remove() 操作?

rust - Rust 中 'mut' 关键字的用法

rust - 读取一级目录结构

angularjs - 手动输入和导入输入的 Angular 形式验证

swift - 对 Swift 3 中的错误处理感到困惑

rust - 如何启用 Rust "crate feature"?

javascript - 如何循环来自生成器的 JavaScript 迭代器?

ios - NSURL错误代码提取

javascript - 是否有任何全局 javascript 错误处理程序? (即使只有 chrome 或 Firefox 也可以)