Rust中生成连续整数切片的惯用方法是什么?
问题解答
首先,你当前的实现可以简化为更惯用的写法:
&(0..len).collect::<Vec<usize>>()
因为Vec<T>实现了Deref<Target=[T]>,&Vec<usize>会被自动隐式转换为&[usize],无需额外调用as_slice()。
无内存分配的实现方案
- 编译期已知长度:可以用静态数组实现零分配
const LEN: usize = 5; const INDICES: [usize; LEN] = { let mut arr = [0; LEN]; let mut i = 0; while i < LEN { arr[i] = i; i += 1; } arr }; // 使用时直接取切片 let indices_slice: &[usize] = &INDICES;
- 运行时动态长度:不存在无内存分配的通用方案
Range<usize>是惰性迭代器,仅记录起始/结束值,不存储完整元素集,无法直接转为连续内存的切片;栈分配数组需要固定大小,无法适配动态长度,且长度过大时会引发栈溢出。这种场景下,用Vec收集迭代器元素是最通用、最符合Rust惯用风格的选择,内存分配开销在多数场景下可接受。
如果需要频繁创建这类索引切片,可封装工具函数简化调用:
fn indices(len: usize) -> Vec<usize> { (0..len).collect() } // 使用示例 let indices_slice: &[usize] = &indices(len);
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

