Rust编写中位数函数时Vec调用sort后调用len()提示未针对()实现的报错
报错原因
你的推测完全正确。
- Rust标准库中
Vec的sort()方法是原地修改式排序,不会返回排序完成后的新向量,该方法的返回值就是单元类型()(即无实际返回内容的特殊类型)。 - 你代码里的
let sorted = v.sort();执行后,sorted变量绑定的根本不是排序后的向量,而是没有任何实际数据的()类型,后续对sorted调用.len()做长度计算、做索引取值的操作,自然会触发“未针对类型()实现len()方法”的报错。
修正实现
因为sort()需要直接修改向量本身,所以需要把待排序的向量绑定为可变变量,排序操作直接作用在原向量上即可,完全不需要接收sort()的返回值。
修正后的可运行代码如下:
fn main() { let vec = vec![1,2,3,4,5]; println!("{}",median(vec)) } fn median(v: Vec<i32>) -> i32 { // 将传入的向量绑定为可变变量 let mut sorted = v; // 执行原地排序,不接收无意义的返回值 sorted.sort(); let med_idx = sorted.len() / 2; sorted[med_idx] }
补充说明
- 原代码里把向量长度强转为
i32的操作没有必要:Vec的len()方法返回的是usize类型,本身就适配向量索引的类型要求,强行转成i32反而会在32位目标架构上出现兼容问题。 - 如果不想修改原向量、希望拿到排序后的独立副本,可以先对原向量做克隆,再对克隆出来的可变副本执行排序即可。
内容的提问来源于stack exchange,提问作者Sam Dillard
相关产品推荐
相关产品推荐

