我想在Rust中创建一个函数,用随机值生成一个x大小的array.我想问一下如何在Rust函数中返回一个数组,如果您能判断我的其余代码是否正常,那就太好了.很抱歉我的基本问题,但我是初学者.

use rand::prelude::*;

fn generateArray(howManyValues: u32)->[f64]
{
    let mut rng = rand::thread_rng();
    let array: [f64, howManyValues];
    for i in 0..howManyValues
    {
        array[i] = rng.gen()*100;
    }

    println!("{:?}", array);
    return array;
}

fn main() {
    generateArray(10);
}

推荐答案

我想在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中通常的索引方式.

Rust相关问答推荐

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

为什么std repeat trait绑定在impl块和关联函数之间?

为什么实例方法可以像Rust中的静态方法一样被调用?

当T不执行Copy时,如何返回Arc Mutex T后面的值?

如何模拟/创建ReqData以测试Actix Web请求处理程序?

有没有一种惯用的方法来判断VEC中是否存在变体?

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

我们可以在 Rust 切片中使用步骤吗?

如何正确使用git2::Remote::push?

sha256 摘要仅适用于 &*

为什么我们有两种方法来包含 serde_derive?

为什么这个闭包没有实现Fn?

如何从 x86_64 Mac 构建 M1 Mac?

一个函数调用会产生双重borrow 错误,而另一个则不会

如何将 Rust 字符串转换为 i8(c_char) 数组?

改变不实现克隆的 dioxus UseState struct

制作嵌套迭代器的迭代器

如何在 Rust 中使用特征标志来捕获多行代码?