使包装器类型实现通用

时间:2016-01-17 12:39:12

标签: rust

我有以下包装类型(类似于std::io::Cursor)以允许限制读取的字节数:

use std::{cmp, io};

pub struct Limited<T> {
    inner: T,
    pos: u64,
    limit: u64,
}

impl<T> Limited<T> {
    pub fn new(inner: T, limit: u64) -> Limited<T> {
        Limited {
            inner: inner,
            pos: 0,
            limit: limit,
        }
    }

    pub fn pos(&self) -> u64 { self.pos }
    pub fn limit(&self) -> u64 { self.limit }
    pub fn into_inner(self) -> T { self.inner }
    pub fn get_ref(&self) -> &T { &self.inner }
    pub fn get_mut(&mut self) -> &mut T { &mut self.inner }
}

impl<T: io::Read> io::Read for Limited<T> {
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
        let can_read = cmp::min(buf.len() as u64, self.limit - self.pos);
        if can_read != 0 {
            match self.inner.read(&mut buf[..(can_read as usize)]) {
                Ok(read) => {
                    self.pos += read as u64;
                    Ok(read)
                },
                e @ _ => e
            }
        } else {
            Ok(0)
        }
    }
}

然后我可以像这样使用它:

let mut l = Limited::new(io::Cursor::new(vec![1, 2, 3]), 1);
assert_eq!(l.read(&mut [0; 10]).unwrap(), 1);

接下来我需要Limited<RefMut<Read>>(因此它拥有RefMut)。添加impl<'a, T: 'a + io::Read> io::Read for Limited<RefMut<'a, T>>会使编译器抱怨实现冲突。

有没有办法让Limited的通用实施适用于ReadRefMut<Read> Rc<Read> ,{{1 }}?

1 个答案:

答案 0 :(得分:2)

  

有没有办法让--------- [shell_awk.sh]--------------------- #!/bin/bash shell_variable_1=<value A> shell_variable_2=<value B> shell_variable_3=<value C> awk 'function A(X) { return X+1 } { a=A('$shell_variable_1') b=A('$shell_variable_2') c=A('$shell_variable_3') shell_variable_1=a shell_variable_2=b shell_variable_3=c }' FILE.TXT --------- [shell_awk.sh]--------------------- 的通用实施适用于LimitedReadRefMut<Read>Rc<Read>

不是。

Deref<Target=Read>Read 1 都是特质。如果您传入实施两个特征的类型,预期行为应该是什么?有a RFC for specialization可能以某种形式或其他形式允许这种情况。顾名思义,它通常是一个更具体的实现,所以我不知道两个不同的特征如何适合。

DerefMut已经实现了RefMut,所以可能会被覆盖。我不知道DerefMut将如何发挥作用,因为它只适用于不可变数据。

1 :我认为您的意思是Rc而不是DerefMut,因为Deref需要一个可变接收器。