看看这两种方法:
fn m1<T: 'static + Fn(&Request) -> Response + Send + Sync>(&mut self, handler: T) {
// It is not important
}
// Same trait bound to the generic
fn m2<T: 'static + Fn(&Request) -> Response + Send + Sync>(&mut self, handler: T) {
// It is not important
}
两者共享相同的界限:
<T: 'static + Fn(&Request) -> Response + Send + Sync>
我可以“分解”这个吗?我试图搜索文档,但也许我没有使用正确的单词。有人可以将我重定向到文档的相关部分(或者如果需要,可以在这里写一个答案)?
答案 0 :(得分:4)
您可以创建一个辅助特征,您可以将其用作简写符号:
trait HandlerFun : 'static + Fn(&Request) -> Response + Send + Sync {}
impl<T> HandlerFun for T
where T: 'static + Fn(&Request) -> Response + Send + Sync
{}
// later
fn m1<T: HandlerFun>(&mut self, handler: T) {}
但是,由于它的冗长,这种情况并不经常使用。事实上,我从未见过私人特质&#34;别名&#34;在任何生产代码中。它还为读者介绍了一些间接性,因为他们必须查找HandlerFun
的定义方式。但有时使用这样一个空的&#34;是完全合理的。将一些其他特征分组的特征;在这种情况下,将其公之于众也常有用。
注意:在原始代码中,您应该使用where
表示法。内联符号<T: BoundA + BoundB>
应仅用于小特征边界。你的界限很长,所以where
表示法更好。