从现有数组创建固定大小的数组时,读取和写入可能会很繁琐,例如:
let foo: [i32; 8] = [
bar[1], bar[2], bar[3], bar[4],
taz[1], taz[2], taz[3], taz[4],
];
除了使用 for
循环来分配值之外,Rust是否提供了一种写入此方法而无需手动扩展数组的方法?
例如,像Python's unpacking generalizations:
let foo: [i32; 8] = [*bar[1..5], *taz[1..5]];
注意:现实世界的示例使用了更多的项目,只是为了保持示例的简短 .
使用向量这是可能的,但是从固定大小的数组移动到向量不是免费的(测试它并且它在释放模式中生成相当多的组件,它执行写入的转换,使用堆内存,其中仅使用简单版本需要堆栈内存) .
let foo: Vec<i32> = bar[1..5].iter().chain(taz[1..5].iter()).cloned().collect();
2 回答
为了好奇,这里是一个支持解包的数组连接宏(限于有限数量的大小,这个宏很小,可以扩展) .
与任何其他解决方案(要了解的配置文件)相比,我没有任何关于此性能或零成本的要求 . 如果您一直使用固定大小的数组,则所有边界检查都在编译时进行 .
第一个用法示例:
然后执行:(playground link)
应用于您的问题,我会这样做:
concat_arrays!(bar[1..];4 taz[1..];4)
这是简洁的,但肯定的是,它有一些问题,例如,在特定宏的特殊语法中,以及源自
4
必须是文字的问题,不仅仅是有限列表中的文字 .编辑:
请参阅expanded macro,包括用于生成支持预定义数量的参数的脚本,该宏可以比此处给出的示例大得多 .
如果你不想进入不安全的代码,我会创建一个
mut Vec<T>
,然后使用extend_from_slice()
逐步扩展它的切片:之后,可以使用
into_boxed_slice()
将其转换为固定长度的切片 . 或者,如果需要数组,可以使用我在another question中找到的函数:然后从之前转换
Vec
如下: