首页 > 解决方案 > Rust 函数如何修改数组索引的值?

问题描述

我的目标是让 Rust 函数f增加一个数组元素x,并增加索引i

fn main() {
    let mut x: [usize; 3] = [1; 3];
    let mut i: usize = 1;
    f(&mut i, &mut x);
    println!("\nWant i = 2, and i = {}", i);
    println!("\nWant x = [1,2,1], and x = {:?}", x);
} // end main

fn f(i: &mut usize, x: &mut [usize]) {
    x[i] += 1;
    i += 1;
} // end f

编译器报告以下错误:

error[E0277]: the trait bound `&mut usize: std::slice::SliceIndex<[usize]>` is not satisfied
  --> src/main.rs:10:5
   |
10 |     x[i] += 1;
   |     ^^^^ slice indices are of type `usize` or ranges of `usize`
   |
   = help: the trait `std::slice::SliceIndex<[usize]>` is not implemented for `&mut usize`
   = note: required because of the requirements on the impl of `std::ops::Index<&mut usize>` for `[usize]`

error[E0368]: binary assignment operation `+=` cannot be applied to type `&mut usize`
  --> src/main.rs:11:5
   |
11 |     i += 1;
   |     -^^^^^
   |     |
   |     cannot use `+=` on type `&mut usize`

如何使函数f增加其数组参数的元素x和索引i(也是参数)?

标签: functionparametersrustincrement

解决方案


您需要取消引用i. 这可能会令人困惑,因为 Rust 为您做了很多自动取消引用

fn main() {
    let mut x: [usize; 3] = [1; 3];
    let mut i: usize = 1;
    f(&mut i, &mut x);
    println!("\nWant i = 2, and i = {}", i);
    println!("\nWant x = [1,2,1], and x = {:?}", x);
} // end main

fn f(i: &mut usize, x: &mut [usize]) {
    x[*i] += 1;
    *i += 1;
} // end f

操场


推荐阅读