使用特征作为别名中的类型参数的语法

nathansizemore

我具有以下特征:

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>>;
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

E0122的详细说明

我相信第二个示例也存在相同的潜在问题,但是警告丢失了—我猜这是应该报告的错误。我认为总的来说,这意味着您还无法做自己想做的事情。


此外,您正在尝试使用特征作为类型(在上面表示为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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将特征与使用特征的关联类型作为参数的超特征绑定?

使用特征作为类型参数时借阅检查器失败

使用特征作为Vec类型

Rust类型不匹配,使用闭包特征别名参数解析`for <'r> ...`

为什么使用我的类型作为外部类型的参数来实现外部特征合法?

Rust:使用通用特征作为特征参数

使用外部定义的模板类型作为模板参数的更通用模板的模板别名

是否可以在特征中声明类型别名?

如何使用别名参数作为资源密钥

不能使用函数(func()类型)作为参数中的类型

在特征中读取类型参数的ClassType

在模板参数包上使用类型特征?

类型不匹配且特征迭代器作为函数参数

是否可以将类型特征限制为不接受其他类型特征作为参数?

为什么C ++中的类型别名在其语法中使用“ using”而不是“ typedef”?

C ++中函数参数的类型别名

在类型特征中,为什么人们使用枚举而不是静态const作为值?

类型作为coq中的参数

使用typeof作为参数类型

使用类型作为参数Typescript

使用枚举作为类型参数

使用类作为其方法中参数的类型提示

使用 ArrayList 作为参数的语法是什么?

使用通用类型参数作为参数

固定大小的特征矩阵作为模板函数中的参数

以匿名结构作为参数导出函数[在package.Func的参数中不能将值(结构{...}类型)作为结构{...}类型使用]

具有关联类型的别名特征

实现封闭类型别名的特征

类型特征的模板别名不起作用