Rust中能否将函数类型从签名移至where子句?长签名优化问询
我太懂这种长签名的痛苦了——Rust的生命周期、泛型和trait约束堆在一起,分分钟让方法签名变得像天书,尤其是用Gotham这类异步Web框架的时候。针对你这个extract_body方法,有几个实用的简化方案,刚好匹配你想要的简洁效果:
方案1:用泛型类型别名抽离复杂返回值
这是最直接的方式,把重复的、冗长的Future类型定义成一个可复用的别名,让方法签名瞬间清爽:
use futures::Future; use gotham::state::State; use gotham::handler::HandlerError; use serde::de::DeserializeOwned; // 先定义一个适配你方法返回值的泛型类型别名 type ExtractBodyFuture<'a, T> = Box<dyn Future<Item = (State, T), Error = (State, HandlerError)> + 'a>; // 简化后的方法签名 pub fn extract_body<'a, T>(mut state: State) -> ExtractBodyFuture<'a, T> where T: 'a + DeserializeOwned, { // 你的方法实现逻辑... }
如果想更紧凑,还可以把trait约束合并到泛型参数里,省掉where子句:
pub fn extract_body<'a, T: 'a + DeserializeOwned>(mut state: State) -> ExtractBodyFuture<'a, T> { // 实现逻辑... }
方案2:用impl Trait简化返回值(Rust 1.26+)
如果你的方法不需要支持动态分发(或者Gotham的Handler兼容impl Trait返回值),这个方案会更简洁,连类型别名都不用定义:
use futures::Future; use gotham::state::State; use gotham::handler::HandlerError; use serde::de::DeserializeOwned; pub fn extract_body<'a, T>(mut state: State) -> impl Future<Item = (State, T), Error = (State, HandlerError)> + 'a where T: 'a + DeserializeOwned, { // 你的方法实现逻辑... }
不过要注意:impl Trait只能作为返回值使用,如果你需要把这个Future类型当作其他函数的参数,还是类型别名更灵活。
额外小技巧:导入常用trait缩短路径
如果觉得DeserializeOwned这类trait名太长,可以在模块顶部导入:
use serde::de::DeserializeOwned as DeserOwned;
然后签名里就可以用T: 'a + DeserOwned,进一步缩短长度。
内容的提问来源于stack exchange,提问作者whitfin
相关产品推荐
相关产品推荐

