< 返回版块

akai100 发表于 2023-10-16 11:17

我有个小功能实现解析字节流,输出解析结果: (1)我首先实现定义一个包装结构体来包装值:

struct ValueWrapper<T>(T);

(2)实现一个流输入:

struct Stream<'a> {
    stream: &'a[u8],
    len: usize,
    read: usize,
}

(3) 通过 ">>" 操作符 解析流:

impl<'a, T> Shr<&ValueWrapper<T>> for &Stream<'a> {
    type Output = Self;
    fn shr(self, rhs: &ValueWrapper<T>) -> Self::Output {
        self >> &rhs.0;
        self
    }
}

这里 self >> &rhs.0; 会报错未定义实现, 我怎么对不同的T类型 实现 Stram >> &T。 操作?

评论区

写评论
ribs 2023-10-17 15:19

没太看懂你的需求,既然用ValueWrapper包装了T,就代表只要实现

Shr<ValueWrapper> for Stram

即可。 但你在shr方法内又调用了Stream >> T,就又变成需要实现

Shr<T> for Stram

那ValueWrapper就没必要了。 还有个问题,type Output = Self,代表Stram >> ValueWrapper结果返回还是Stram,不应该是ValueWrapper吗?如果是需求是从Stram解析出ValueWrapper,那>>操作符不太适合

作者 akai100 2023-10-17 10:03

目前我有个解决方案:

struct ValueWrapper<T> {
   value: T,
}

pub struct Stream<'a> {
    stream: &'a[u8],
    len: usize,
    read: usize,
}

trait StreamShr<T> : Shr<T> {
    fn shr(self, rhs: T) -> Self::Output;
}

impl<'b, 'a, T> Shr<&'b mut ValueWrapper<T>> for &'a mut Stream<'a> where &'a mut Stream<'a> : StreamShr<&'b mut T> {
    type Output = Self;

    fn shr(self, rhs: &'b mut ValueWrapper<T>) -> Self::Output {
        let new = & mut *self;
        new >> & mut rhs.value;
        self
    }
}

但是 最后有一个 shr 需要返回引用类型,即self, 但是这里又需要使用self 调用 >> self 是 & mut T, 无法clone 或者 copy

作者 akai100 2023-10-16 18:57

大概就是这个功能: Stream >> ValueWrapper(T) Stream >> ValueWrapper.self.0

--
👇
bestgopher: 没看懂。。。

作者 akai100 2023-10-16 18:56

不好意思 这个方法 我没看懂

--
👇
ribs: impl<'a, T> Shr<&T> for &Stream<'a> 不行吗?再根据需要去限定T

bestgopher 2023-10-16 18:17

没看懂。。。

ribs 2023-10-16 16:21

impl<'a, T> Shr<&T> for &Stream<'a> 不行吗?再根据需要去限定T

作者 akai100 2023-10-16 11:49

我最开始的方法是加一个限定符:

impl<'a, T> Shr<&ValueWrapper<T>> for &Stream<'a>  where &'a Stream: Shr<&T> {
    type Output = Self;
    fn shr(self, rhs: &ValueWrapper<T>) -> Self::Output {
        self >> &rhs.0
    }
}

1 共 7 条评论, 1 页