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

Пример кода:

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 ответ

Решение

Когда вы передаете по значению, вы передаете право собственности на стоимость. Копии переменной не требуются - сначала 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 будет выглядеть без изменений.

Другие вопросы по тегам