Хотел тут проделать примерно то что увидел в byteorder:
pub trait Ordered{
fn read_u16(buf: &[u8]) -> u16;
}
pub enum LittleEndian {}
impl Ordered for LittleEndian{
fn read_u16(buf: &[u8]) -> u16{
read_num_bytes!(u16, 2, buf, to_le)
}
}
pub trait OrderedRead: Read {
#[inline]
fn read_u16<T: Ordered>(&mut self) -> Result<u16, IoError> {
let mut buf = [0; 2];
self.read_exact(&mut buf)?;
Ok(T::read_u16(&buf))
}
}
impl<R: Read> OrderedRead for R {}
В принципе всё вроде нормально:
fn test_1()->Result<u16,IoError>{
let fname = "test.txt";
let mut reader = io::BufReader::new(File::open(&fname)?);
Ok(reader.read_u16::<LittleEndian>()?)
}
А вот как сделать так, чтобы можно было работать по ссылке?
Что-то типа такого:
fn test_3(r: &Read)->Result<u16,IoError>{
// error[E0599]: no method named `read_u16` found for type `&dyn std::io::Read` in the current scope;
Ok(r.read_u16::<LittleEndian>()?)
}
Конечно, можно через бокс заюзать:
fn test_2(r: Box<dyn Read>)->Result<u16,IoError>{
Ok(r.read_u16::<BigEndian>()?)
}
Но возможно ли через ссылку?
UPD.
А, нет, отбой тревоги.
Всё решил.
Просто забыл про impl Trait:
fn test_3( r: &mut impl Read ) ->Result<u16,IoError> {
Ok(r.read_u16::<LittleEndian>()?)
}
UPD2.
Нельзя ночью код писать.
Забыть добавить mut
и удивляться почему метод не найден.
fn test_3( mut r: &mut Read)->Result<u16,IoError>{
Ok(r.read_u16::<LittleEndian>()?)
}