首页 > 解决方案 > 数组意外未被函数修改

问题描述

代码运行得很好,但所有值都是 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;
    }
}

标签: arraysrandomrust

解决方案


第一行代码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

那么,为什么a不修改呢?

这是因为您没有提供对rnd函数的引用,而是提供了一个副本(当包含的类型执行时,数组都实现Copy了)。

现在很清楚你需要做什么:

将您的功能更改为

fn rnd (x: &mut [time; MAX], y: usize) {

这样您就可以传递一个 mut 引用,然后将其称为

rnd(&mut a, MAX);

操场

下一步当然是停止允许一切。编译器警告应该很少被忽略。


推荐阅读