如何命名一组类型边界?

Max*_*ber 6 traits rust

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

例如,如果不是:

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

Leo*_*Leo 7

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

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)

  • 这是我一直在寻找的答案,但我将[有关 nightly 的答案](/sf/answers/4800302041/) 标记为所选答案,因为如果该功能落地,它可能对后代更有用。 (2认同)

les*_*les 7

如果您使用夜间 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)

然后任何满足两者的类型CopyDebug将自动满足CopyDebug

因为此功能是夜间功能,所以您需要将其放在#![feature(trait_alias)]crate 主文件的顶部。


归档时间:

查看次数:

259 次

最近记录:

4 年,1 月 前