Rust中FnMut接收不可变引用的含义及相关疑问
Rust sort_by_key闭包参数疑问解答
先看对应的代码片段:
pub fn sort_by_key<K, F>(&mut self, mut f: F) where F: FnMut(&T) -> K, K: Ord, { merge_sort(self, |a, b| f(a).lt(&f(b))); }
1. FnMut接收不可变引用&T意味着什么?
这里的&T表示闭包f只能读取被排序的元素,完全没有权限修改元素的内部状态。
这种设计的核心逻辑是:排序操作本身只需要基于元素的某个属性生成可比较的K值,以此确定元素的顺序,根本不需要修改元素本身。同时这么做还有额外优势:
- 遵循最小权限原则,避免排序过程中意外修改元素的风险
- 支持对包含不可变数据的集合排序,比如存放
&str、不可变结构体的Vec - 降低闭包的使用门槛,不需要元素必须提供可变访问权限
2. FnMut是否本应接收可变引用&mut T?
完全不需要,甚至不应该这么做:
- 排序的语义是调整元素顺序,而非修改元素内容。如果允许闭包用
&mut T,会混淆接口的用途,给用户错误的操作暗示 - 从实现层面看,内部的
merge_sort只需要读取元素来做比较,&T已经足够满足需求,用&mut T属于权限过度开放 - 若用户真的需要在排序前修改元素,应该在调用
sort_by_key之前单独处理,而非依赖排序闭包来完成
内容的提问来源于stack exchange,提问作者user3698446
相关产品推荐
相关产品推荐

