Почему неизменяемые переменные могут передаваться в качестве аргументов функциям, которые требуют изменяемых аргументов? - PullRequest
0 голосов
/ 10 января 2019

Пример кода:

fn main() {
    let a = [1, 2, 3, 4, 5];
    reset(a);
}

fn reset(mut b: [u32; 5]) {
    b[0] = 5;
}

Переменная a является неизменяемым массивом, а параметр функции reset b является изменяемым массивом; Интуитивно мне нужно изменить a в изменяемый массив, прежде чем я смогу вызвать метод reset, но компилятор говорит мне, что мне не нужно это делать, почему это так?

fn main() {
    let mut a = [1, 2, 3, 4, 5];
    reset(a);
}

fn reset(mut b: [u32; 5]) {
    b[0] = 5;
}
warning: variable does not need to be mutable
 --> src/main.rs:2:9
  |
2 |     let mut a = [1, 2, 3, 4, 5];
  |         ----^
  |         |
  |         help: remove this `mut`
  |
  = note: #[warn(unused_mut)] on by default

1 Ответ

0 голосов
/ 10 января 2019

Когда вы передаете по значению, вы передаете право собственности на значение. Копии переменной не требуются - сначала main владеет ею, затем reset владеет ею, затем она исчезает 1 .

В Rust, когда вы владеете переменной, вы можете управлять ее изменчивостью. Например, вы можете сделать это:

let a = [1, 2, 3, 4, 5];
let mut b = a;

Вы также можете сделать то же самое внутри reset, хотя я бы не сделал бы это, предпочитая использовать mut в сигнатуре функции:

fn reset(b: [u32; 5]) {
    let mut c = b;
    c[0] = 5;
}

Смотри также:


1 - В в этом конкретном случае ваш тип - [i32; 5], который реализует черту Copy. Если вы попытались использовать a после передачи права собственности на reset, то будет сделана неявная копия. Значение a будет отображаться без изменений.

...