I need to initialize each element of an array to a non-constant expression. Can I do that without having to first initialize each element of the array to some meaningless ex
NOTE: This is an old answer, std::mem::uninitialized
have been deprecating in 1.38.0
: use mem::MaybeUninit instead
In some cases, you can use std::mem::uninitialized:
let mut ys: [i32; 1000] = unsafe { std::mem::uninitialized() };
This is unsafe because accessing uninitialized values is undefined behavior in Rust and the compiler can no longer guarantee that every value of ys
will be initialized before it is read. It can also easily cause undefined behavior if the type inside the array (i32
here) is not valid for all possible bit patterns. This means that something like std::mem::uninitialized::<[&i32; 1]>()
is immediate undefined behavior, regardless of what you do to the array afterwards.
You cannot collect into an array, but if you had a Vec
instead, you could do:
let ys: Vec<_> = xs.iter().map(|&x| x / 3).collect();
For your specific problem, you could also clone the incoming array and then mutate it:
let mut ys = xs.clone();
for y in ys.iter_mut() { *y = *y / 3 }