#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
что-либо, чтобы повлиять на что-либо за пределами текущей итерации цикла.