如果我有一长串必须在很多地方重复的类型界限,我该如何给它们命名?
例如,如果不是:
fn foo<T: Thing>(t: T) -> T
where T: Copy, T: Debug { ... }
Run Code Online (Sandbox Code Playgroud)
我想写:
fn foo<T: Thing>(t: T) -> T
where T: CopyDebug { ... }
Run Code Online (Sandbox Code Playgroud)
在哪里CopyDebug
定义为Copy+Debug
?
您可以通过创建一个空特征来将类型界限列表组合成单个特征,该空特征需要其实现者的完整类型界限列表,如下所示:
trait MyCombination: A + B + C + D {}
impl<T: A + B + C + D> MyCombination for T {}
Run Code Online (Sandbox Code Playgroud)
所以对于 的情况CopyDebug
,你可以写:
trait CopyDebug: Copy + Debug {}
impl<T: Copy + Debug> CopyDebug for T {}
Run Code Online (Sandbox Code Playgroud)
如果您使用夜间 Rust,则可以使用夜间功能trait_alias
( https://doc.rust-lang.org/unstable-book/language-features/trait-alias.html )
trait CopyDebug = Copy + Debug;
Run Code Online (Sandbox Code Playgroud)
然后任何满足两者的类型Copy
也Debug
将自动满足CopyDebug
。
因为此功能是夜间功能,所以您需要将其放在#![feature(trait_alias)]
crate 主文件的顶部。
归档时间: |
|
查看次数: |
259 次 |
最近记录: |