Как функция Rust может изменить значение индекса массива? - PullRequest
0 голосов
/ 28 июня 2018

Моя цель состоит в том, чтобы функция 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 (также параметр)?

1 Ответ

0 голосов
/ 28 июня 2018

Вам нужно разыменовать 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

площадка

...