是否可以将函数类型从签名中移出到where子句中?

时间:2018-04-24 04:46:18

标签: rust

我在Rust中有一个特别长的方法签名,在使用最新的格式化程序格式化时看起来像这样(对于那些感兴趣的人,这是使用Gotham):

pub fn extract_body<'a, T: 'a>(
    mut state: State,
) -> Box<Future<Item = (State, T), Error = (State, HandlerError)> + 'a>
where
    T: DeserializeOwned,
{

签名非常长,我更喜欢这样的东西:

pub fn extract_body<'a, T: 'a>(mut state: State) -> Box<F + 'a>
where
    T: DeserializeOwned,
    F: Future<Item = (State, T), Error = (State, HandlerError)>,
{

请注意使用F以便更好地格式化。不幸的是,这不编译。有没有办法在不引入另一种通用类型的情况下实现相同的目标?我目前正在使用语法extract_body::<Value>进行调用,并希望避免对此进行调整(因为它只是一种风格化的东西)。

是否可以通过这种方式使用where语法,还是严格基于泛型的使用?我发现这种语法的文档非常缺乏。

1 个答案:

答案 0 :(得分:6)

您可以使用type来简化返回类型:

pub type ReturnType<'a, T> = Box<Future<Item = (State, T), Error = (State, HandlerError)> + 'a>;

pub fn extract_body<'a, T: 'a>(mut state: State) -> ReturnType<'a, T>
where
    T: DeserializeOwned,
{
    // ...
}
在这种情况下不能使用

where,向泛型类型添加约束很有用,例如在执行静态调度时。