Как правильно выбрать реализацию черты в Rust? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть черта, которая ожидает либо 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, это будет оценено в комментариях! ;)

1 Ответ

1 голос
/ 13 октября 2019

Вы можете устранить неоднозначность, ссылаясь непосредственно на метод черты, например:

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 []);
}

Это называется Синтаксис универсального вызова функции (не удается найти эту главу в новой книге, поэтомуЯ связываю первое издание).

Я не думаю, что этого достаточно, чтобы сделать правильной реализацию Read, поскольку это только продвинет (временный) фрагмент. Смотрите мой комментарий на Cursor.

...