我想创建一个函数,生成一个随机值为
X
大小的数组。
类型
[f64]
是一个
slice,而不是一个
array。数组需要一个长度,例如
[f64; 25]
。
对于这个任务,Rust的
Vec
比数组或切片更好,除非您使用某种外部函数接口(FFI),或者Rust API需要一个数组(它可能需要
Deref<Target = [T]>
,基本上是针对所有类似数组的类型,包括
Vec
和数组)。
Vec
类似于C++的
std::vector
和Java的
ArrayList
。
use rand::prelude::*;
fn generate_vec(len: usize) -> Vec<f64> {
let mut rng = rand::thread_rng();
let mut vec = Vec::with_capacity(len);
for _ in 0..len {
vec.push(rng.gen::<f64>() * 100.);
}
return vec;
}
fn main() {
let generated_vec = generate_vec(10);
println!("{:?}", generated_vec);
}
我进行了一些样式更改[1]。如果你真的需要一个数组,请继续阅读。
如果您在编译时知道数组的大小,可以使用数组。如果它太大而无法放入堆栈中,您将会遇到堆栈溢出。Rust 1.51通过常量泛型使这变得稍微更加人性化。
use rand::prelude::*;
fn generate_array<const LEN: usize>() -> [f64; LEN] {
let mut rng = rand::thread_rng();
let mut arr = [0.; LEN];
for item in arr.iter_mut() {
*item = rng.gen::<f64>() * 100.;
}
arr
}
fn main() {
let generated_array1:[f64; 5] = generate_array();
let generated_array2:[f64; 10] = generate_array();
println!("{:?}", generated_array2);
}
如果您在编译时不知道长度,或者长度太大无法放入堆栈中,则最接近数组的东西是使用into_boxed_slice()
的Box<[T]>
(T
的切片的Box
)。
use rand::prelude::*;
fn generate_array(len: usize) -> Box<[f64]> {
let mut rng = rand::thread_rng();
let mut vec = Vec::with_capacity(len);
for _ in 0..len {
vec.push(rng.gen::<f64>() * 100.);
}
vec.into_boxed_slice()
}
fn main() {
let generated_array = generate_array(10);
println!("{:?}", generated_array);
}
[1] 函数名中的单词使用下划线分隔而不是驼峰式,将 println
移动到 main()
中并将 len 的类型更改为 usize
,因为这是 Rust 中数组通常索引的方式。