我有一个特征,期望将reqwest::Response或Vec作为参数,只将它们放入select::document::Document中。为此,我需要以某种方式为io::Read
获得Vec<u8>
的实现才能使用Document::from_read
。
这是我想出的:
use select::document::Document;
use std::{io::Read, io::Result};
#[derive(Debug)]
pub struct ReadableVec<T>(Vec<T>);
impl Read for ReadableVec<u8> {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
println!("Read!");
let mut r: &[u8] = &self.0[..];
r.read(buf) //< issue is here!!
}
}
fn main() {
let buf = ReadableVec(vec![60, 116]);
let doc = Document::from_read(buf);
println!("{:?}", doc)
}
[我的问题是:为什么r.read(buf)
调用Read
的ReadableVec
实现而不是&[u8]
,从而使我的函数递归调用自己? r
的类型似乎很明显由上面的行指示。
PS:如果有更好的解决方案可以同时处理Vec<u8>
和reqwest::Response
,请在评论中表示赞赏! ;)
您可以通过直接引用trait方法来消除歧义,例如:
use std::io::Read;
#[derive(Debug)]
pub struct ReadableVec<T>(Vec<T>);
impl Read for ReadableVec<u8> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
println!("Read!");
Read::read(&mut &self.0[..], buf)
}
}
fn main() {
let mut buf = ReadableVec(vec![60, 116]);
buf.read(&mut []);
}
这称为Universal Function Call Syntax(在新书中找不到本章,所以我要链接第一版)。
我认为这不足以使Read
的实现正确,因为这只会推进(临时)切片。请参阅我对Cursor
的评论。