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