arrays - 数组意外未被函数修改
问题描述
代码运行得很好,但所有值都是 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;
}
}
解决方案
第一行代码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);
下一步当然是停止允许一切。编译器警告应该很少被忽略。
推荐阅读
- java - 使用 ProcessBuilder 运行 docker-compose up 成功,但 ProcessBuilder 不返回结果
- bash - 回显后不显示输出
- adobe-indesign - 如果 TextFrame == "Test" 存在,则复制或复制页面
- android - 房间实体默认值 VS 辅助构造函数
- php - PHP:将两个数组设置为键和值
- php - 在以 0-9 开头的单个页面中获取商店
- javascript - 类型和实现它的类的命名约定是什么?
- android - 如何实现垂直回收器视图,该视图一次只显示一个项目,向上滑动时显示下一个项目?
- javascript - 我在使用 ReactJS 时遇到 css-loader/dist/runtime/api.js “错误:ENOENT:没有这样的文件或目录”的编译错误
- ruby - Jekyll:在 docker 上运行 jekyll