如何在Rust中选择适当的特征实现?

问题描述 投票:0回答:1

我有一个特征,期望将reqwest::ResponseVec作为参数,只将它们放入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)调用ReadReadableVec实现而不是&[u8],从而使我的函数递归调用自己? r的类型似乎很明显由上面的行指示。

PS:如果有更好的解决方案可以同时处理Vec<u8>reqwest::Response,请在评论中表示赞赏! ;)

rust overloading traits
1个回答
0
投票

您可以通过直接引用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的评论。

© www.soinside.com 2019 - 2024. All rights reserved.