是否可以在数组前面附加值?我知道如何连接两个数组,但是如果我有一个数组和一个值(与数组的类型相同(,我可以将此元素附加到数组中吗?
在稳定的 Rust 中没有办法做到这一点;数组不能在运行时添加或删除值;它们的长度在编译时是固定的。
你更有可能想要一个Vec
和Vec::insert
.
另请参阅:
- 如何动态设置 Rust 数组长度?
- 切片和数组有什么区别?
- 存储 Vec 与切片有什么区别?
- 有效地在 Vec 的中间或开头插入或替换多个元素?
在夜间 Rust 中,您可以使用不稳定的特性来构造一个稍大的全新数组,并将所有值移过:
// 1.52.0-nightly (2021-03-07 234781afe33d3f339b00)
#![allow(incomplete_features)]
#![feature(const_generics, const_evaluatable_checked)]
use std::{
array::IntoIter,
mem::{self, MaybeUninit},
ptr,
};
fn prepend<T, const N: usize>(a: [T; N], v: T) -> [T; N + 1] {
// # SAFETY
//
// Converting an uninitialized array to an array of
// uninitialized values is always safe.
// https://github.com/rust-lang/rust/issues/80908
let mut xs: [MaybeUninit<T>; N + 1] = unsafe { MaybeUninit::uninit().assume_init() };
let (head, tail) = xs.split_first_mut().unwrap();
*head = MaybeUninit::new(v);
for (x, v) in tail.iter_mut().zip(IntoIter::new(a)) {
*x = MaybeUninit::new(v)
}
// # SAFETY
//
// We are effectively transmuting from an array of filled `MaybeUninit<T>` to
// the array of `T`, but cannot actually use `transmute`:
// https://github.com/rust-lang/rust/issues/61956
unsafe {
let tmp_xs = &mut xs as *mut [MaybeUninit<T>; N + 1] as *mut [T; N + 1];
mem::forget(xs);
ptr::read(tmp_xs)
}
}
fn main() {
let v = prepend([1, 2, 3], 4);
assert_eq!([4, 1, 2, 3], v);
}
另请参阅:
- 是否可以使用泛型的类型参数控制数组的大小?
- 如何一次将值移出数组一个?
- 如何收集到数组中?
use phpify::array::array_unshift;
let mut queue = vec!["orange", "banana"];
array_unshift(&mut queue, "apple");
assert_eq!(queue, vec!["apple", "orange", "banana"]);
参考:https://docs.rs/phpify/0.1.0-beta4/phpify/array/index.html
另一种方法是在 Rust 中编写类似于 https://stackoverflow.com/a/8963973/9676346 的函数