无法将 io::Error 移出 Peekable 结果
Cannot move io::Error out of Peekable Result
我只是想传播 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
、*e
、e.clone()
、*e.clone()
、*(e.clone())
,但它们都产生了“类型不匹配”或“无法移动”错误。
Peekable
迭代器通过 peek
持有其内部迭代器的下一个值和 returns 引用的所有权,但如果你真的想要拥有的值,你只需调用 next
像往常一样(它确实推进了迭代器,但我认为在这种情况下没关系,因为你实际上并没有使用迭代器中的任何内容,而只是试图 return 一个错误):
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),
}
}
我只是想传播 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
、*e
、e.clone()
、*e.clone()
、*(e.clone())
,但它们都产生了“类型不匹配”或“无法移动”错误。
Peekable
迭代器通过 peek
持有其内部迭代器的下一个值和 returns 引用的所有权,但如果你真的想要拥有的值,你只需调用 next
像往常一样(它确实推进了迭代器,但我认为在这种情况下没关系,因为你实际上并没有使用迭代器中的任何内容,而只是试图 return 一个错误):
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),
}
}