Почему неизменяемые переменные могут передаваться в качестве аргументов функциям, которые требуют изменяемых аргументов?
Пример кода:
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;
}
Смотрите также:
- Какой идиоматический способ передать изменяемое значение?
- Какая разница между размещением "mut" перед именем переменной и после ":"?
1 - В этом конкретном случае ваш тип [i32; 5]
, который реализует Copy
черта характера. Если вы пытались использовать a
после передачи права собственности на reset
, тогда будет сделана неявная копия. Значение a
будет выглядеть без изменений.