Int*_*ity 0 arrays random rust
代码运行得很好,但所有值都是 0,当它们应该是从 0 和 60 / 300 范围内随机生成的数字时,如代码所示。使用 Rust 游乐场作为 ide。
#![allow(dead_code, mutable_transmutes, non_camel_case_types, non_snake_case,
non_upper_case_globals, unused_assignments, unused_mut)]
const MAX: usize = 16;
#[derive(Copy, Clone)]
struct time {
h: i32,
m: i32,
s: i32,
}
fn rnd (mut x: [time; MAX], y: usize) {
use rand::Rng;
let mut rng = rand::thread_rng();
let mut i: usize = 0;
while i < y {
x[i].h = rng.gen_range(0..300);
x[i].m = rng.gen_range(0..60);
x[i].s = rng.gen_range(0..60);
i+=1;
}
}
fn main () {
let mut a: [time; MAX] = [time{h: 0, m: 0, s: 0,}; MAX];
let mut i: usize = 0;
rnd(a, MAX);
while i < MAX {
println!("{}", a[i].h);
i += 1;
}
}
Run Code Online (Sandbox Code Playgroud)
带有 all 的第一行代码allow只做一件事:它阻止编译器帮助您。
让我们删除unused_mut. 现在编译器警告你:
warning: variable does not need to be mutable
--> src/main.rs:24:9
|
24 | let mut a: [time; MAX] = [time{h: 0, m: 0, s: 0,}; MAX];
| ----^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
Run Code Online (Sandbox Code Playgroud)
那么,为什么a不修改呢?
这是因为您没有提供对rnd函数的引用,而是提供了一个副本(当包含的类型执行时,数组都实现Copy了)。
现在很清楚你需要做什么:
将您的功能更改为
fn rnd (x: &mut [time; MAX], y: usize) {
Run Code Online (Sandbox Code Playgroud)
以便您传递 mut 引用,然后将其称为
rnd(&mut a, MAX);
Run Code Online (Sandbox Code Playgroud)
下一步当然是停止允许一切。编译器警告应该很少被忽略。