面试题答案
一键面试闭包类型推断基本过程
- 分析闭包参数:编译器查看闭包定义中的参数列表,确定参数的数量及是否有参数。
- 分析闭包体:对闭包体中的表达式进行分析,确定返回值类型。若闭包体有多条语句,以最后一条语句的返回值类型为准,除非使用
return
提前返回。 - 结合上下文:根据闭包使用的上下文,例如作为函数参数传递给有特定参数类型要求的函数,或者赋值给特定类型的变量,来最终确定闭包类型。
给定闭包的类型推断
对于闭包 let closure = |x| x + 1;
:
- 参数类型推断:因为闭包体中使用
x
进行+
操作,且右侧为数字1
,所以x
类型应为能与i32
进行加法操作的类型,在没有其他上下文信息时,Rust 会推断x
为i32
类型。 - 返回值类型推断:闭包体
x + 1
的结果类型为i32
,所以该闭包的返回值类型为i32
。 综合起来,该闭包类型推断为fn(i32) -> i32
。
提高代码可读性的优化
- 显式标注参数类型:
let closure = |x: i32| x + 1;
- 定义闭包类型别名:
type MyClosure = fn(i32) -> i32;
let closure: MyClosure = |x| x + 1;