Преобразование неизменяемой переменной в изменяемую путем владения - PullRequest
1 голос
/ 14 июля 2020

Я просматривал книгу Rust с официального сайта Rust и наткнулся на следующий абзац :

Обратите внимание, что нам нужно было сделать v1_iter изменяемый: вызов следующего метода на итераторе изменяет внутреннее состояние, которое итератор использует для отслеживания того, где он находится в последовательности. Другими словами, этот код потребляет или использует итератор. Каждый вызов next съедает элемент из итератора. Нам не нужно было делать v1_iter изменяемым, когда мы использовали a для l oop, потому что l oop стал владельцем v1_iter и сделал его изменяемым за кулисами.

Если вы заметили последнюю строчку. Он говорит, что for l oop делает изменяемую переменную неизменной за кулисами. Если это возможно, то можем ли мы, как программисты, сделать то же самое?

Как будто я знаю, что это небезопасно, и мы не должны делать это и прочее, но просто задаемся вопросом, возможно ли это .

1 Ответ

3 голосов
/ 14 июля 2020

Совершенно нормально повторно привязать неизменяемую переменную к изменяемой, например, следующий код работает:

let x = 5;
let mut x = x;

После последнего оператора мы можем изменить x переменную. На самом деле, подумал, есть две переменные, первая перемещена в последнюю. То же самое можно сделать и с функцией:

fn f(mut x: i32) {
    x += 1;
}

let y = 5;
f(y);

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

...