我想实现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,而不是迭代器。
我该如何解决这个错误?什么错误对象具有编译时已知的恒定大小?
返回
\n\nResult<usize, std::io::Error>\nRun Code Online (Sandbox Code Playgroud)\n\n代替
\n\nResult<usize, Error>\nRun Code Online (Sandbox Code Playgroud)\n\nstd::error::Error您在签名中使用的\xe2\x80\x99 是一个特征。您可以\xe2\x80\x99t 直接返回特征。
你也可以这样做
\n\nResult<usize, Box<dyn Error>>\nRun Code Online (Sandbox Code Playgroud)\n\nA \xe2\x80\x9ctrait object\xe2\x80\x9d,但我不明白 \xe2\x80\x99t 为何在这种情况下会这样做。
\n| 归档时间: |
|
| 查看次数: |
1727 次 |
| 最近记录: |