特征限制了泛型方法:如何定义相同的边界而不重复自己

时间:2016-08-29 11:49:58

标签: rust

看看这两种方法:

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>

我可以“分解”这个吗?我试图搜索文档,但也许我没有使用正确的单词。有人可以将我重定向到文档的相关部分(或者如果需要,可以在这里写一个答案)?

1 个答案:

答案 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表示法更好。