Rust中Vec类型作为函数参数的正确写法是什么?
正确的实现方式
最符合Rust惯用写法且能解决你的问题的方案,是将参数定义为不可变切片&[Type]:
fn my_func(list: &[Type]);
优势说明
- 无需额外转换:
Vec<Type>会自动解引用为切片,调用时直接传&my_vec或者my_vec.as_slice()即可,完全不用.iter().collect()这类冗余操作。 - 兼容性更强:切片是Rust中表示连续元素序列的通用类型,除了
Vec,数组[Type; N]、Box<[Type]>等类型都能直接传入这个函数,让你的代码更灵活。
如果你的函数只需要遍历元素、不需要随机访问,还可以用更通用的迭代器参数定义:
fn my_func(list: impl IntoIterator<Item = &Type>);
这种定义支持传入任何能生成&Type迭代器的类型,比如&Vec<Type>、&[Type]甚至&HashSet<Type>,调用时同样直接传引用即可,无需额外处理。
为什么之前的写法不合理?
你改成&Vec<&Type>的做法完全没必要——这个类型要求参数是存储了引用的Vec,但你原本的Vec<Type>是持有元素所有权的,所以必须额外收集引用成新Vec,既浪费内存又违背了Rust的零成本抽象设计。
内容的提问来源于stack exchange,提问作者Antosser
相关产品推荐
相关产品推荐

