Rust中如何将二维Vec作为切片类型参数传递给函数?
问题原因
- 一维场景能正常运行依赖Rust的
Deref隐式转换规则:Vec<T>实现了Deref<Target = [T]>特征,所以传&Vec<usize>类型的参数时,编译器会自动将其转换为&[usize],和函数签名完全匹配。 - 二维场景触发类型不匹配错误:你定义的变量
a是Vec<Vec<usize>>类型,传&a只会被转换为&[Vec<usize>],但函数要求的参数是&[&[usize]]。Vec<usize>和&[usize]是完全不同的类型,编译器不会自动帮你遍历切片把每个元素都做Deref转换,因此直接传参会报错。
解决方法
方案1:修改函数签名(更推荐,无额外性能开销)
直接调整函数参数签名适配输入类型,或者用AsRef特征做泛型适配,兼容更多输入场景:
fn main() { let a: Vec<Vec<usize>> = vec![ vec![1,2,3,4,], vec![5,6,7,8,], ]; print_it(&a); // 正常运行 } // 适配方式1:直接匹配输入的&[Vec<usize>]类型 // fn print_it(p: &[Vec<usize>] ) { // println!("{:?}", p); // } // 适配方式2:泛型兼容,既支持&[Vec<usize>]也支持&[&[usize]]输入 fn print_it<T: AsRef<[usize]> + std::fmt::Debug>(p: &[T] ) { println!("{:?}", p); }
方案2:不修改函数签名,转换输入参数
如果不能改动原函数的签名,可以先把原二维Vec的每一个子Vec转成切片,收集为新的Vec<&[usize]>后再传切片给函数:
fn main() { let a: Vec<Vec<usize>> = vec![ vec![1,2,3,4,], vec![5,6,7,8,], ]; // 遍历转换每个子Vec为切片 let a_slice: Vec<&[usize]> = a.iter().map(|v| v.as_slice()).collect(); print_it(&a_slice); // 正常运行 } fn print_it(p: &[&[usize]] ) { println!("{:?}", p); }
内容的提问来源于stack exchange,提问作者Alexandra Danith Ansley
相关产品推荐
相关产品推荐

