Теневые переменные в петлях ржавчины - PullRequest
0 голосов
/ 19 апреля 2020

Я новичок в Rust и не уверен, почему значение затененной переменной foo не изменяется в for l oop

fn main() {
    let foo: i32 = 5;
    for _x in 0..5{
    let foo = foo+1;
    }
    println!("Value of foo: {}", foo);
    //This prints Value of foo: 5

    let bar: i32 = 5;
    let bar = bar+1;
    println!("Value of bar: {}", bar);
    //This prints Value of foo: 6
}

Я прошел Раздел «Переменные и изменчивость» и некоторые вопросы по стеку, но я не смог найти причину, по которой значение foo не изменяется? Я вижу такое же поведение в loop

  1. Есть ли у for и loop некоторые ограничения на теневые переменные? И почему это не разрешено?
  2. Если теневое копирование переменной не является хорошей практикой в ​​циклах, следует ли мне использовать mut способную переменную?

    • автомобиль go версия 1.42.0

1 Ответ

3 голосов
/ 19 апреля 2020

let "вводит / создает новую переменную".

Таким образом, let foo = foo+1; создает новую переменную с именем "foo", которая живет только внутри l oop. Эта переменная инициализируется как foo+1, и только «правая сторона foo» относится к уже существующему foo.

Таким образом, только «inner-l oop * 1010» * "создан, и внешний foo не затронут l oop.

Если вы хотите изменить внешний foo, попробуйте следующее:

let mut foo: i32 = 5; // mut tells rust that variable is going to be modified
for _x in 0..5{
    foo = foo+1; // no "let", so not introducing a new variable
}
println!("Value of foo: {}", foo);

С другой стороны, let bar=bar+1 создает новую переменную bar в той же области видимости, что и предыдущая bar, поэтому первая bar затеняется новым bar и, по сути, более недоступна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...