我具有以下特征:
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);
}
我尝试了以下方法:
pub type StreamList = LinkedList<Stream>
产生:
error: wrong number of type arguments: expected 1, found 0
并pub type StreamList = LinkedList<Stream<T: Read + Write + AsRawFd>>
产生:
error: expected one of '!', '(', '+', ',', '::', '<', or '>', found ':'
Stream
用作类型参数的正确语法是什么?
从语法上讲,我认为这是您想要的:
trait OuterTrait<T> {
fn use_type_parameter(t: T);
}
trait InnerTrait {}
type CombinedTypeOne<T: InnerTrait> = Option<OuterTrait<T>>;
type CombinedTypeTwo<T> where T: InnerTrait = Option<OuterTrait<T>>;
fn main() {}
从更大的意义上讲,这是有道理的。定义类型时,它必须完全知道它是什么类型,或者具有类型参数,并在使用现场进行完全指定。在您的示例中,类型的StreamList
行为就像是完全指定的那样。但是,右侧显示“输入任何具体类型”,因此您需要更正两者。
除此之外,特征约束位于别名的“声明”部分,而不是“定义”部分。这反映了特征和功能定义的工作方式。
但是,第一个示例具有以下警告:
warning: trait bounds are not (yet) enforced in type definitions [E0122]
type CombinedTypeOne<T: InnerTrait> = Option<OuterTrait<T>>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我相信第二个示例也存在相同的潜在问题,但是警告丢失了—我猜这是应该报告的错误。我认为总的来说,这意味着您还无法做自己想做的事情。
此外,您正在尝试使用特征作为类型(在上面表示为Option<OuterTrait>
。尽管从概念上讲是可能的,但我不知道如何实际构造看起来像这样的对象。您更可能想要类似的东西
type CombinedTypeOne<T, U: OuterTrait<T>> = Option<U>;
type CombinedTypeTwo<T, U> where U: OuterTrait<T> = Option<U>;
但这抱怨未使用的类型参数。我无法推理出该错误是否有意义,或者是该功能尚未实施的副作用:
error: type parameter `T` is unused [E0091]
type CombinedTypeOne<T, U: OuterTrait<T>> = Option<U>;
^~~~~~~~~
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句