为何Rust的sort_by_key函数要求FnMut闭包而非Fn?
为什么sort_by_key要求FnMut而非Fn?
首先得搞清楚Rust闭包类型的兼容关系:Fn 类型的闭包可以自动转换成 FnMut,但反过来不行。这意味着,接受FnMut的函数,既能处理不会修改捕获变量的闭包,也能处理会修改的;但如果函数只限定接受Fn,那需要修改变量的闭包就没法用了。
sort_by_key设计成要求FnMut,核心是为了最大化灵活性。举个实际例子:你可能需要在闭包里维护一个临时的缓存或者计数器,用来优化key的计算效率——这类闭包需要修改捕获的变量,属于FnMut范畴。如果sort_by_key只接受Fn,那这类实用场景就直接被排除了。
而对于你提到的不修改捕获变量的闭包,完全不用担心兼容性问题——因为Fn是FnMut的子类型,编译器会自动把你的Fn闭包适配成FnMut,不会有任何额外的性能损耗。
另外从实现层面来说,sort_by_key在排序过程中会多次调用闭包,而闭包是被独占使用的,不需要支持多线程或多上下文的共享调用,所以FnMut的约束已经足够安全,没必要强行要求更强的Fn约束。
总结几点核心原因:
FnMut兼容Fn类型的闭包,不修改变量的闭包照样能正常使用- 保留
FnMut约束可以支持更多需要修改捕获变量的实用场景 - 排序过程中闭包是独占调用,不需要
Fn的共享可调用约束,没必要增加限制
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

