Rust中无法将`&Box<[Box<str>]>`转为`&[&str]`的问题求解
解决Rust中
Box<[Box<str>]>与&[&str]的类型不匹配问题 问题背景
我编写了一个接收&[&'a str]参数的快速排序函数:
fn user_quicksort<'a>(list: &[&'a str]) -> Vec<&'a str>
调用时,我持有的是Box<[Box<str>]>类型的变量input,直接传入触发了类型不匹配错误:
error[E0308]: mismatched types --> src\main.rs:36:33 | 36 | let sorted = user_quicksort(&input); | -------------- ^^^^^^ expected `&[&str]`, found `&Box<[Box<str>]>` | | | arguments to this function are incorrect | = note: expected reference `&[&str]` found reference `&Box<[Box<str>]>`
选择Box<str>而非String是因为它不可变、性能更优且内存占用更低,input的生成代码如下:
let input = fs::read_to_string("input.txt") .expect("Unable to read file") .split("\n") .map(|s| s.to_string().into_boxed_str()) .collect::<Box<[Box<str>]>>();
解决方案
方案1:修改排序函数的参数类型
让函数直接适配Box<str>的切片,无需额外转换即可调用:
fn user_quicksort<'a>(list: &[&'a Box<str>]) -> Vec<&'a Box<str>> { // 保留原排序逻辑,Box<str>可直接参与字符串比较 if list.is_empty() { return Vec::new(); } let pivot = list[0]; let (left, right): (Vec<_>, Vec<_>) = list[1..].split(|&x| x < pivot).collect(); let mut result = user_quicksort(&left); result.push(pivot); result.extend(user_quicksort(&right)); result }
调用时将Box<[Box<str>]>转为切片:
let sorted = user_quicksort(input.as_ref());
方案2:生成临时&[&str]切片适配原函数
如果无法修改user_quicksort,可以将Box<[Box<str>]>中的每个元素转为&str,生成临时切片后传入:
// 生成临时Vec<&str>,仅持有引用,内存开销极小 let temp_slice: Vec<&str> = input.iter().map(|s| s.as_ref()).collect(); let sorted = user_quicksort(&temp_slice);
方案3:调整输入的收集类型
若允许修改input的生成逻辑,可将其改为Vec<Box<str>>,后续转换会更直观:
let input: Vec<Box<str>> = fs::read_to_string("input.txt") .expect("Unable to read file") .split("\n") .map(|s| s.to_string().into_boxed_str()) .collect(); // 生成临时切片调用原函数 let temp_slice: Vec<&str> = input.iter().map(|s| s.as_ref()).collect(); let sorted = user_quicksort(&temp_slice);
内容的提问来源于stack exchange,提问作者Antosser
相关产品推荐
相关产品推荐

