rust 如何接受同一方法的所有者身份或可变引用

6tqwzwtp  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(124)

我在Rust中围绕TCP协议做了一个库,并且我还试图使它与异步运行时无关。
我想让它接受现有连接的所有权,或者接受对它的可变引用。也就是说,我想让调用者决定谁应该删除连接。
我有这个

pub struct ReadableStream<T: AsyncRead + AsyncWrite> {
    reader: FramedRead<ReadHalf<T>, WordCodec>,
}

pub struct WriteableStream<T: AsyncRead + AsyncWrite> {
    writer: FramedWrite<WriteHalf<T>, WordCodec>,
}

pub struct AsyncStream<T: AsyncRead + AsyncWrite> {
    read_stream: ReadableStream<T>,
    write_stream: WriteableStream<T>,
}

impl<T: AsyncRead + AsyncWrite> From<T> for AsyncStream<T> {
    fn from(stream: T) -> Self {
        let parts = stream.split();
        Self {
            read_stream: ReadableStream::new(parts.0),
            write_stream: WriteableStream::new(parts.1),
        }
    }
}

impl<'stream, T: AsyncRead + AsyncWrite + Unpin> From<&'stream mut T>
    for AsyncStream<&'stream mut T>
{
    fn from(stream: &'stream mut T) -> Self {
        let parts = stream.split();
        Self {
            read_stream: ReadableStream::new(parts.0),
            write_stream: WriteableStream::new(parts.1),
        }
    }
}

但是这无法编译,因为“AsyncStream<&mut _>的实现冲突“。如果我取消注解第二个实现,第一个实现会编译。我也可以只编译第二个...但是我希望两者都有。我希望根据from()是像AsyncStream::from(source)还是像AsyncStream::from(&mut source)那样调用来调用。
我该怎么做呢?
注意:FramedRead/FramedWrite来自asynchronous-codec。AsyncRead、AsyncWrite、ReadHalf、WriteHalf来自futures crate。WordCodec是我为异步编解码器定制的协议的实现,与手头的问题无关。

5sxhfpxr

5sxhfpxr1#

我决定咬紧牙关,在我的struct(AsyncStream)中实现一个方法来进行转换,并可能为我计划测试的特定运行时实现From,使用户能够在他们的运行时没有被覆盖时使用struct的方法。
这种方法是可行的......但除此之外,它还揭示了我试图做的事情由于另一个原因而不完全可行。我希望能够将连接拆分为reader和writer,但我不能这样做,因为split()占据了所有权。
我将通过只接受所有权来解决所有权/可变引用问题,并提供一个使用self并返回 Package 流的方法。这并不完全符合我所希望的人机工程学,但它解决了希望让用户从一个点使用我的lib,到另一个点,并从/到其他东西切换的场景。

相关问题