如何命名一组类型边界?

How can I name a set of type bounds?

如果我有一长串必须在很多地方重复的类型边界,我该如何给它们命名?

例如,如果不是:

fn foo<T: Thing>(t: T) -> T
    where T: Copy, T: Debug { ... }

我要写:

fn foo<T: Thing>(t: T) -> T
    where T: CopyDebug { ... }

其中 CopyDebug 定义为 Copy+Debug?

您可以通过创建一个需要其实现者的完整类型界限列表的空特征,将类型界限列表组合成单个特征,如下所示:

trait MyCombination: A + B + C + D {}
impl<T: A + B + C + D> MyCombination for T {}

所以在CopyDebug的情况下可以这样写:

trait CopyDebug: Copy + Debug {}
impl<T: Copy + Debug> CopyDebug for T {}

如果您使用的是 nightly Rust,则可以使用 nightly 功能 trait_alias (https://doc.rust-lang.org/unstable-book/language-features/trait-alias.html)

trait CopyDebug = Copy + Debug;

然后任何同时满足CopyDebug的类型也将自动满足CopyDebug

因为这个功能是夜间的,所以你需要把 #![feature(trait_alias)] 放在你的 crate 主文件的顶部。