Как автоматически реализовать некие методы для всех типов, реализующих некий трейт?

Например, я хочу сделать метод read_one_byte для всех типов, для которых сделан impl Read. Код выглядит так:
impl<T: Write> T {
    fn read_one_byte(&self) -> Option<u8> {
        let mut buf = [0u8];
        match self.read(&mut buf) {
            Ok(count) if count == 1 => Some(buf[0]),
            _ => None,
        }
    }
}

При компиляции получаю ошибку
error[E0118]: no base type found for inherent implementation
 --> src/main.rs:4:16
  |
4 | impl<T: Write> T {
  |                ^ impl requires a base type
  |
  = note: either implement a trait on it or create a newtype to wrap it instead
https://doc.rust-lang.org/error-index.html#E0118

Мне, конечно, совсем не нужна такая функция, но она как пример того, что я хочу сделать.
  • Вопрос задан
  • 219 просмотров
Решения вопроса 1
1. Можно создать новый трейт, который будет расширять стандартный:
use std::io::Read;

trait ReadOneByte: Read {
    fn read_one_byte(&mut self) -> Option<u8>;
}

impl<T: Read> ReadOneByte for T {
    fn read_one_byte(&mut self) -> Option<u8> {
        let mut buf = [0u8];
        match self.read(&mut buf) {
            Ok(count) if count == 1 => Some(buf[0]),
            _ => None,
        }
    }
}


2. А вообще-то лучше использовать обычные функции:
fn read_one_byte<T: Read>(source: &mut T) -> Option<u8> {
    let mut buf = [0u8];
    match self.read(&mut buf) {
        Ok(count) if count == 1 => Some(buf[0]),
        _ => None,
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы