我有以下包装类型(类似于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
的通用实施适用于Read
,RefMut<Read>
, ,{{1 }}?Rc<Read>
答案 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]---------------------
的通用实施适用于Limited
,Read
,RefMut<Read>
,Rc<Read>
?
不是。
Deref<Target=Read>
和Read
1 都是特质。如果您传入实施两个特征的类型,预期行为应该是什么?有a RFC for specialization可能以某种形式或其他形式允许这种情况。顾名思义,它通常是一个更具体的实现,所以我不知道两个不同的特征如何适合。
DerefMut
已经实现了RefMut
,所以可能会被覆盖。我不知道DerefMut
将如何发挥作用,因为它只适用于不可变数据。
1 :我认为您的意思是Rc
而不是DerefMut
,因为Deref
需要一个可变接收器。