Измените индекс внутри цикла » для » с диапазоном в Rust

#for-loop #rust

#для-петли #Ржавчина

Вопрос:

Я смотрю на какой-то код, который выглядит так:

 for mut i in 2..points.len() {  // Do something  if some_condition {  i  = 1;  }   }  

Он компилируется и работает нормально (кажется). Моей первой интуицией было то, что это было бы лучше в виде while петли. Затем я начал задаваться вопросом, законно ли это вообще делать в Rust? Что произойдет, если вам случится i выйти за пределы диапазона? Я предполагаю, что, очевидно, проблемы…

Я хотел бы знать, есть ли какие-либо проблемы с изменением индекса при прохождении с ним диапазона. Я предполагаю, что i он остается в пределах досягаемости, но мне было бы интересно узнать, что происходит, когда он тоже выходит за пределы диапазона.

Комментарии:

1. Здесь нет никаких проблем. Значение i не является индексом, это значение из диапазона, с которым вы сгенерировали 2..points.len() . Вы можете изменять и модифицировать i столько, сколько захотите, он просто будет переназначен для следующей итерации. Если вы попытались взять значение из точек, points[i] вы можете получить ошибку индекса, но просто изменить его самостоятельно не проблема (до тех пор, пока вы не превысите ограничения по типу).

Ответ №1:

Ваш код

 for mut i in 2..points.len() {  // Do something  if some_condition {  i  = 1;  } }  

будет ли внутренне в компиляторе переписано в более простых терминах с использованием loop , во что-то вроде этого:

 let mut iter = (2..points.len()).into_iter(); loop {  if let Some(mut i) = iter.next() {  // Do something  if some_condition {  i  = 1;  }  } else {  break  } }  

В этой форме, мы надеемся, должно быть более ясно, что на самом деле здесь происходит: i объявляется внутри тела цикла и присваивается следующее значение из итератора диапазона в начале каждой итерации. Если вы измените его, он будет просто переназначен на следующей итерации. В частности, вы не можете изменить i что-либо, чтобы повлиять на что-либо за пределами текущей итерации цикла.