gpt4 book ai didi

rust - 使包装器类型实现通用

转载 作者:行者123 更新时间:2023-11-29 08:27:38 27 4
gpt4 key购买 nike

我有以下包装器类型(类似于 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> , <罢工> Rc<Read> , DerefMut<Target=Read>

最佳答案

Is there a way to have a generic implementation of Limited that would work for Read, RefMut<Read>, Rc<Read>, Deref<Target=Read>?

不是真的。

ReadDerefMut 1 都是特征。如果您传入一个实现了两个特征的类型,预期的行为应该是什么?有 a RFC for specialization这可能会以某种形式允许这样做。顾名思义,它通常是关于更具体的实现,所以我不知道如何适应两个截然不同的特征。

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

1:我假设你的意思是 DerefMut而不是 Deref作为Read需要一个可变的接收器。

关于rust - 使包装器类型实现通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34838396/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com