实现读取特征:特征绑定 `std::error::Error + 'static: std::marker::Sized` 不满足

Roh*_*cht 1 rust

我想实现Read结构的特征,以便在 a 中使用它BufReader来传递给库。该库使用 aBufReader作为输入,因为它应该与Stdin实现Read.

use std::error::Error;
use std::io::Read;

pub struct Test {
    counter: u8,
}

impl Test {
    pub fn new() -> Test {
        Test { counter: 0 }
    }
}

impl Iterator for Test {
    type Item = String;

    fn next(&mut self) -> Option<Self::Item> {
        if self.counter < 2 {
            self.counter += 1;
            return Some("String".to_string());
        }

        None
    }
}

impl Read for Test {
    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> {
        let content = self.next();
        match content {
            None => Err(std::io::Error::new(
                std::io::ErrorKind::Other,
                "End of Iterator",
            )),
            Some(string) => {
                let mut i = 0;
                loop {
                    if i >= buf.len() || i >= string.len() {
                        break;
                    }

                    buf[i] = string[i];
                    i += 1;
                }

                Ok(i)
            }
        }
    }
}

fn main() {
    let test = Test::new();
    let reader = std::io::BufReader::new(test);
    // let filter = lib_that_uses_bufreader::useful_function(reader);
}
Run Code Online (Sandbox Code Playgroud)

游乐场

当尝试实现Read该结构时,我收到错误:

use std::error::Error;
use std::io::Read;

pub struct Test {
    counter: u8,
}

impl Test {
    pub fn new() -> Test {
        Test { counter: 0 }
    }
}

impl Iterator for Test {
    type Item = String;

    fn next(&mut self) -> Option<Self::Item> {
        if self.counter < 2 {
            self.counter += 1;
            return Some("String".to_string());
        }

        None
    }
}

impl Read for Test {
    fn read(&mut self, buf: &mut [u8]) -> Result<usize, Error> {
        let content = self.next();
        match content {
            None => Err(std::io::Error::new(
                std::io::ErrorKind::Other,
                "End of Iterator",
            )),
            Some(string) => {
                let mut i = 0;
                loop {
                    if i >= buf.len() || i >= string.len() {
                        break;
                    }

                    buf[i] = string[i];
                    i += 1;
                }

                Ok(i)
            }
        }
    }
}

fn main() {
    let test = Test::new();
    let reader = std::io::BufReader::new(test);
    // let filter = lib_that_uses_bufreader::useful_function(reader);
}
Run Code Online (Sandbox Code Playgroud)

我自己构建了这个库,所以它可以改变,但它工作得很好Stdin,我现在想将它与结构一起使用。该库使用BufReader::lines,因此它可以与迭代器交换,但据我了解,这会破坏与 的兼容性Stdin,因为我只能构建BufReaderaround Stdin,而不是迭代器。

我该如何解决这个错误?什么错误对象具有编译时已知的恒定大小?

Ste*_*nik 5

返回

\n\n
Result<usize, std::io::Error>\n
Run Code Online (Sandbox Code Playgroud)\n\n

代替

\n\n
Result<usize, Error>\n
Run Code Online (Sandbox Code Playgroud)\n\n

std::error::Error您在签名中使用的\xe2\x80\x99 是一个特征。您可以\xe2\x80\x99t 直接返回特征。

\n\n

你也可以这样做

\n\n
Result<usize, Box<dyn Error>>\n
Run Code Online (Sandbox Code Playgroud)\n\n

A \xe2\x80\x9ctrait object\xe2\x80\x9d,但我不明白 \xe2\x80\x99t 为何在这种情况下会这样做。

\n