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

whi*_*fin 3 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,
{
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Fre*_*ios 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,
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

where 在这种情况下不能使用,向泛型类型添加约束很有用,例如在执行静态调度时.

  • @ljedrz:编写`Box <F>`并将`+'a`推入`where`子句会使`F`再次具体化.但这也许不是OP想要的. (2认同)