我在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
语法,还是严格基于泛型的使用?我发现这种语法的文档非常缺乏。
答案 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
,向泛型类型添加约束很有用,例如在执行静态调度时。