具有泛型的特征的语法

Syntax for traits with generics

我有以下特点:

pub trait Stream<T: Read + Write + AsRawFd>: Sized {
    fn new(stream: T) -> Result<Self, Error>;
    fn recv(&mut self) -> Result<Vec<u8>, Error>;
    fn send(&mut self, buf: &[u8]) -> Result<usize, Error>;
}

我想创建另一个特征,它采用实现 Stream 的类型作为其中一个函数的参数,如下所示:

pub trait EventHandler<T: Stream> {
    fn on_data_received(&mut self, stream: T, buffer: Vec<u8>);
    fn on_stream_closed(&mut self, id: u32);
}

我已经尝试了几种关于放置特征定义的变体,但我似乎总是得到错误:

error: wrong number of type arguments: expected 1, found 0

正确的语法是什么?

您需要在 <T: Stream> 绑定上指定一个类型参数,如下所示:

pub trait EventHandler<T: Stream<U>, U: Read + Write + AsRawFd> {
    fn on_data_received(&mut self, stream: T, buffer: Vec<u8>);
    fn on_stream_closed(&mut self, id: u32);
}

您还可以使用 where 子句编写边界:

pub trait EventHandler<T, U> where
    T: Stream<U>,
    U: Read + Write + AsRawFd
{
    fn on_data_received(&mut self, stream: T, buffer: Vec<u8>);
    fn on_stream_closed(&mut self, id: u32);
}

另一种选择是使用关联类型。像这样定义 Stream

pub trait Stream: Sized {
    type T: Read + Write + AsRawFd;

    fn new(stream: Self::T) -> Result<Self, Error>;
    fn recv(&mut self) -> Result<Vec<u8>, Error>;
    fn send(&mut self, buf: &[u8]) -> Result<usize, Error>;
}

那么您对 ​​EventHandler 的原始定义将起作用。