如何命名一组类型边界?
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;
然后任何同时满足Copy
和Debug
的类型也将自动满足CopyDebug
。
因为这个功能是夜间的,所以你需要把 #![feature(trait_alias)]
放在你的 crate 主文件的顶部。
如果我有一长串必须在很多地方重复的类型边界,我该如何给它们命名?
例如,如果不是:
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;
然后任何同时满足Copy
和Debug
的类型也将自动满足CopyDebug
。
因为这个功能是夜间的,所以你需要把 #![feature(trait_alias)]
放在你的 crate 主文件的顶部。