我想创建一个函数,它生成一个大小为 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 使用 const generics 使其更符合人体工程学。
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() {
// generate_array can make an array of any length (within stack size limits)
let generated_array1:[f64; 5] = generate_array();
let generated_array2:[f64; 10] = generate_array();
println!("{:?}", generated_array2);
}
如果您在编译时不知道长度,或者它太大而无法放入堆栈,那么您可以使用的最接近数组的是Box<[T]>(Box 的切片 T) into_boxed_slice().
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 中通常索引数组的方式。