我想在Rust中创建一个函数,用随机值生成一个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].如果你想要一个数组,请继续阅读.
如果在编译时知道数组的大小,可以使用array.但是如果它太大,无法放在堆栈上,则会导致堆栈溢出.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);
}
如果您在编译时不知道长度,或者它太大而无法放入堆栈,那么使用into_boxed_slice()
可以得到的最接近数组的值是Box<[T]>
(t的切片框).
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] 函数名中的单词用下划线而不是camelCase分隔,将println
移到main()
,并将len的类型更改为usize
,因为这是数组在rust中通常的索引方式.